怎么读取jar包内部的log4j配置文件

图片说明
这个是我的项目结构,在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这个文件的配置,这个是怎么可以读取到并且打印日志的

不知道你这个问题是否已经解决, 如果还没有解决的话:
  • 你可以看下这个问题的回答https://ask.csdn.net/questions/725684
  • 除此之外, 这篇博客: log4j1.2.17的使用与log4j.properties配置详解中的 3、配置日志信息输出目的地(appender) 部分也许能够解决你的问题, 你可以仔细阅读以下内容或者直接跳转源博客中阅读:
    ###配置日志信息输出目的地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;

如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^