Java如何获取别的项目传来的syslog数据

Python011

Java如何获取别的项目传来的syslog数据,第1张

[ bar == "$foo" ]

[ 命令中不能用 ==,应当写成

[ bar = "$foo" ] &&echo yes

[[ bar == $foo ]] &&echo yes

Syslog4j本身自带了一个服务端的例子程序:SyslogServerMain。这是一个命令行方式的日志服务器的实现。

命令参数说明如下:

SyslogServer [-h<host>] [-p <port>] [-o <file>] [-a] [-q] <protocol>

-h <host> host or IP to bind

-p<port> port to bind

-t<timeout>socket timeout (in milliseconds)

-o<file> file to write entries(overwrites by default)

-a append to file (instead ofoverwrite)

-q do not write anything to standardout

protocol Syslog4j protocol implementation (tcp,udp, ...)

命令执行方法如下:

java -cpsyslog4j-0.9.46.jar org.productivity.java.syslog4j.server.SyslogServerMain -p5555 udp

代表的含义是使用本机的5555端口,通过UDP协议接收日志。

NoClassDefFoundError解决示例

当发生由于缺少jar文件,或者jar文件没有添加到classpath,或者jar的文件名发生变更会导致java.lang.NoClassDefFoundError的错误

当类不在classpath中时,这种情况很难确切的知道,但如果在程序中打印出System.getproperty(“java.classpath”),可以得到程序实际运行的classpath

运行时明确指定你认为程序能正常运行的 -classpath 参数,如果增加之后程序能正常运行,说明原来程序的classpath被其他人覆盖了。

NoClassDefFoundError也可能由于类的静态初始化模块错误导致,当你的类执行一些静态初始化模块操作,如果初始化模块抛出异常,哪些依赖这个类的其他类会抛出NoClassDefFoundError的错误。如果你查看程序日志,会发现一些java.lang.ExceptionInInitializerError的错误日志,ExceptionInInitializerError的错误会导致java.lang.NoClassDefFoundError: Could not initialize class,如下面的代码示例:

/**

* Java program to demonstrate how failure of static initialization subsequently cause

* java.lang.NoClassDefFoundError in Java.

* @author Javin Paul

*/

public class NoClassDefFoundErrorDueToStaticInitFailure {

public static void main(String args[]){

List<User>users = new ArrayList<User>(2)

for(int i=0i<2i++){

try{

users.add(new User(String.valueOf(i)))//will throw NoClassDefFoundError

}catch(Throwable t){

t.printStackTrace()

}

}

}

}

class User{

private static String USER_ID = getUserId()

public User(String id){

this.USER_ID = id

}

private static String getUserId() {

throw new RuntimeException("UserId Not found")

}

}

Output

java.lang.ExceptionInInitializerError

at testing.NoClassDefFoundErrorDueToStaticInitFailure.main(NoClassDefFoundErrorDueToStaticInitFailure.java:23)

Caused by: java.lang.RuntimeException: UserId Not found

at testing.User.getUserId(NoClassDefFoundErrorDueToStaticInitFailure.java:41)

at testing.User.<clinit>(NoClassDefFoundErrorDueToStaticInitFailure.java:35)

... 1 more

java.lang.NoClassDefFoundError: Could not initialize class testing.User

at testing.NoClassDefFoundErrorDueToStaticInitFailure.main(NoClassDefFoundErrorDueToStaticInitFailure.java:23)

由于NoClassDefFoundError是LinkageError的子类,而LinkageError的错误在依赖其他的类时会发生,所以如果你的程序依赖原生的类库和需要的dll不存在时,有可能出现java.lang.NoClassDefFoundError。这种错误也可能抛出java.lang.UnsatisfiedLinkError: no dll in java.library.path Exception Java这样的异常。解决的办法是把依赖的类库和dll跟你的jar包放在一起。

如果你使用Ant构建脚本来生成jar文件和manifest文件,要确保Ant脚本获取的是正确的classpath值写入到manifest.mf文件

Jar文件的权限问题也可能导致NoClassDefFoundError,如果你的程序运行在像linux这样多用户的操作系统种,你需要把你应用相关的资源文件,如Jar文件,类库文件,配置文件的权限单独分配给程序所属用户组,如果你使用了多个用户不同程序共享的jar包时,很容易出现权限问题。比如其他用户应用所属权限的jar包你的程序没有权限访问,会导致java.lang.NoClassDefFoundError的错误。

基于XML配置的程序也可能导致NoClassDefFoundError的错误。比如大多数Java的框架像Spring,Struts使用xml配置获取对应的bean信息,如果你输入了错误的名称,程序可能会加载其他错误的类而导致NoClassDefFoundError异常。我们在使用Spring MVC框架或者Apache Struts框架,在部署War文件或者EAR文件时就经常会出现Exception in thread “main” java.lang.NoClassDefFoundError。

在有多个ClassLoader的J2EE的环境中,很容易出现NoClassDefFoundError的错误。由于J2EE没有指明标准的类加载器,使用的类加载器依赖与不同的容器像Tomcat、WebLogic,WebSphere加载J2EE的不同组件如War包或者EJB-JAR包。关于类加载器的相关知识可以参考这篇文章类加载器的工作原理。

总结来说,类加载器基于三个机制:委托、可见性和单一性,委托机制是指将加载一个类的请求交给父类加载器,如果这个父类加载器不能够找到或者加载这个类,那么再加载它。可见性的原理是子类的加载器可以看见所有的父类加载器加载的类,而父类加载器看不到子类加载器加载的类。单一性原理是指仅加载一个类一次,这是由委托机制确保子类加载器不会再次加载父类加载器加载过的类。现在假设一个User类在WAR文件和EJB-JAR文件都存在,并且被WAR ClassLoader加载,而WAR ClassLoader是加载EJB-JAR ClassLoader的子ClassLoader。当EJB-JAR中代码引用这个User类时,加载EJB-JAR所有class的Classloader找不到这个类,因为这个类已经被EJB-JAR classloader的子加载器WAR classloader加载。

这会导致的结果就是对User类出现NoClassDefFoundError异常,而如果在两个JAR包中这个User类都存在,如果你使用equals方法比较两个类的对象时,会出现ClassCastException的异常,因为两个不同类加载器加载的类无法进行比较。

有时候会出现Exception in thread “main” java.lang.NoClassDefFoundError: com/sun/tools/javac/Main 这样的错误,这个错误说明你的Classpath, PATH 或者 JAVA_HOME没有安装配置正确或者JDK的安装不正确。这个问题的解决办法时重新安装你的JDK。

Java在执行linking操作的时候,也可能导致NoClassDefFoundError。例如在前面的脚本中,如果在编译完成之后,我们删除User的编译文件,再运行程序,这个时候你就会直接得到NoClassDefFoundError,而错误的消息只打印出User类的名称。

java.lang.NoClassDefFoundError: testing/User

at testing.NoClassDefFoundErrorDueToStaticInitFailure.main(NoClassDefFoundErrorDueToStaticInitFailure.java:23)

现在我们知道要怎样去面对NoClassDefFoundError异常并解决它了。