String name=菜鸡 2019-07-18 10:19 采纳率: 0%
浏览 431

怎么读取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这个文件的配置,这个是怎么可以读取到并且打印日志的

  • 写回答

1条回答 默认 最新

  • CSDN-Ada助手 CSDN-AI 官方账号 2022-09-21 01:53
    关注
    不知道你这个问题是否已经解决, 如果还没有解决的话:
    • 你可以看下这个问题的回答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;

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

报告相同问题?

悬赏问题

  • ¥30 求一段fortran代码用IVF编译运行的结果
  • ¥15 深度学习根据CNN网络模型,搭建BP模型并训练MNIST数据集
  • ¥15 lammps拉伸应力应变曲线分析
  • ¥15 C++ 头文件/宏冲突问题解决
  • ¥15 用comsol模拟大气湍流通过底部加热(温度不同)的腔体
  • ¥50 安卓adb backup备份子用户应用数据失败
  • ¥20 有人能用聚类分析帮我分析一下文本内容嘛
  • ¥15 请问Lammps做复合材料拉伸模拟,应力应变曲线问题
  • ¥30 python代码,帮调试,帮帮忙吧
  • ¥15 #MATLAB仿真#车辆换道路径规划