这个是我的项目结构,在eclipse中运行项目时日志可以正常输出,打成jar包之后log日志不输出了,在cmd命令行运行jar包时出现了这个警告
log4j:WARN No appenders could be found for logger (util.UtilEncoding).
log4j:WARN Please initialize the log4j system properly.
log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig for more info.
在pom文件中我指定了log4j.properties路径
src/main/resources
log4j.properties
true
项目打成jar包之后怎么读取log4j的配置文件,让日志能够正常输出
第二,当我把log4j.properties这个配置文件放到jar包外面时,配置文件和我的jar包时在同一个文件夹下面的时候可以正常打印日志,项目中我没有做任何读取log4j.properties这个文件的配置,这个是怎么可以读取到并且打印日志的
不知道你这个问题是否已经解决, 如果还没有解决的话:###配置日志信息输出目的地Appender及Appender选项
log4j.appender.Console=org.apache.log4j.ConsoleAppender
log4j.appender.Console.target=System.err
Appender主要解决日志输出源的问题,比如日志输出到操作系统的console,日志输出到数据库中,日志输出到socket接口,不过当前用的最多的是将日志输出到磁盘文件中。Appender的实现类很多,如下图所示:
Appender的实现类有十几个,他们有一个共同的抽象父类AppenderSkeleton。Log4j提供输出源实现类常见的有以下几种:
appender类型 | 说明 |
org.apache.log4j.ConsoleAppender | 将日志输出到控制台 |
org.apache.log4j.FileAppender | 将日志输出到文件 |
org.apache.log4j.DailyRollingFileAppender | 每天产生一个日志文件 |
org.apache.log4j.RollingFileAppender | 文件大小到达指定尺寸时产生一个新的文件 |
org.apache.log4j. WriterAppender | 将日志信息以流格式发送到任意指定的地方 |
工作中最常用的还是ConsoleAppender、FileAppender、DailyRollingFileAppender和RollingFileAppender这4个。
3.1、AppenderSkeleton.java
AppenderSkeleton是一个抽象类,同时是所有appender类的父类.AppenderSkeleton提供对于过滤器filter的支持,比如能根据日志级别进行过滤.。其里面3个重要的属性是:layout、threshold、errorHandler
//AppenderSkeleton.java 源码中的属性
//日志字符串输出格式化类,比如格式话为字符串就直接调用Object.toString(),或者格式化为json
protected Layout layout;
//appender名称
protected String name;
//日志级别,默认为空
protected Priority threshold;
//默认的异常处理类OnlyOnceErrorHandler
protected ErrorHandler errorHandler = new OnlyOnceErrorHandler();
3.2、WriterAppender.java
WriterAppender.java通过java的IO流操作类(java.io.Writer或者java.io.OutputStream)来分别对字符流和字节流分别进行处理,拥有父类AppenderSkeleton的属性,其里面还有2个重要的属性是:immediateFlush、encoding
//WriterAppender.java 源码中的属性
/**
* IO流是否立即清理写入到磁盘文件,默认为true
* 这个属性控制着java.io.Writer或者java.io.OutputStream是否每次appender执行时候立即写磁盘
*/
protected boolean immediateFlush = true;
/**
* 这个属性控制着java.io.Writer或者java.io.OutputStream的编码类型,默认为null时会读取系统的编码类型
*/
protected String encoding;
3.3、ConsoleAppender.java
ConsoleAppender是往console里丢入日志,ConsoleAppender具体调用的是java的System.out和System.err,默认使用System.out。拥有父类WriterAppender的属性,其里面还有1个重要的属性是:target
//ConsoleAppender.java 源码中的属性
//ConsoleAppender具体调用的是java的System.out和System.err,默认使用System.out
public static final String SYSTEM_OUT = "System.out";
public static final String SYSTEM_ERR = "System.err";
protected String target = SYSTEM_OUT;
3.4、FileAppender.java
FileAppender使用java.io.Writer来讲日志写入到磁盘文件。拥有父类WriterAppender的属性。其里面还有4个重要的属性是:Append、BufferedIO、BufferSize、File
//FileAppender.java 源码中的属性,这个类中的set方法有两个名字比较特殊,与定义名不一样
protected boolean fileAppend = true;//是否在文件末尾追加内容 set方法使用:setAppend
protected String fileName = null;//磁盘文件全路径名称 set方法使用:File
protected boolean bufferedIO = false;//是否启用缓冲区
protected int bufferSize = 8 * 1024;//缓冲区大小
3.5、DailyRollingFileAppender.java
DailyRollingFileAppender仍然使用java.io.Writer来讲日志写入到磁盘文件,不同的是它可以控制按照天存储文件、按照小时存储文件、按照分钟存储文件、按照月份存储文件和按照周存储文件。拥有父类FileAppender的属性。其里面还有1个重要的属性是:datePattern
//DailyRollingFileAppender.java 源码中的属性
private String datePattern = "'.'yyyy-MM-dd"; //按照时间来写日志文件,默认按天
DatePattern | 文件分割规则 | 举例 |
---|---|---|
'.'yyyy-MM | 按照月份存储文件 | 在2002年5月31日午夜/foo/bar.log 将被复制到/foo/bar.log2002-05。6月份的日志将输出到/foo/bar.log直到下个月它也被滚动过。 |
'.'yyyy-ww | 按照周存储文件,每周的第一由当前系统的时区决定,比如美国以SUNDAY为一周第一天 | 假设一周的第一天是周日2002年6月9日,周六午夜,文件/foo/bar.log 将被复制到/foo/bar.log2002-23。2002年第24周的日志将输出到/foo/bar.log直到下个星期它被翻转过来。 |
'.'yyyy-MM-dd | 按照天存储文件,每天晚上的12点会变更文件名字 | 午夜,2002年3月8日,/foo/bar.log 将被复制到/foo/bar.log.2002-03-08。3月9日的日志将输出到/foo/bar.log直到第二天它被翻过来。 |
'.'yyyy-MM-dd-a | 按照半天存储文件,中午的12点和晚上的12点时候会变更文件名字 | 2002年3月9日中午/foo/bar.log 将被复制到/foo/bar.log.2002-03-09-am。9号下午的日志将输出到/foo/bar.log直到午夜被翻过来。 |
'.'yyyy-MM-dd-HH | 按照小时存储文件 | 大约在2002年3月9日11点/foo/bar.log 将被复制到/foo/bar.log.2002-03-09-10。3月9日11时的日志将输出到/foo/bar.log直到下一个小时开始的时候,它才被翻过来。 |
'.'yyyy-MM-dd-HH-mm | 按照分钟存储文件 | 大约在2001年3月9日11:23:000/foo/bar.log 将被复制到/foo/bar.log. 2001-03-09-10-22.11:23。(3月9日)的记录将输出到/foo/bar.log直到下一分钟它被翻过来。 |
3.6、RollingFileAppender.java
RollingFileAppender扩展了FileAppender,支持按照文件大小来分割文件。拥有父类FileAppender的属性,其里面还有3个重要的属性是:MaxFileSize、MaximumFileSize、MaxBackupIndex。
需要注意的是MaximumFileSize和MaxFileSize都可以设置最大文件的大小,MaxFileSize可以携带单位KB MB GB,RollingFileAppender会自己解析转换,MaximumFileSize(字节)则直接设置最大文件的大小。
//RollingFileAppender.java 源码中的属性
/**
* 每个文件的最大Bytes大小值,默认10MB
*/
protected long maxFileSize = 10 * 1024 * 1024;
/**
* 默认除了在写的日志文件外,保留最多maxBackupIndex个日志文件,默认最多保留1个文件,外加一个在写的日志文件,总计2个日志文件
*/
protected int maxBackupIndex = 1;