Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/logging/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Log4j:如何配置最简单的文件日志记录?_Java_Logging_Log4j - Fatal编程技术网

Java Log4j:如何配置最简单的文件日志记录?

Java Log4j:如何配置最简单的文件日志记录?,java,logging,log4j,Java,Logging,Log4j,我的故事: 我想制作一个尽可能简单的log4j记录器,将行记录到文件中。我发现了几个具有一些功能的示例,但不是一个真正起作用的基本、通用的示例,也没有一个解释了每一行是如何工作的 问题: 有人能提供吗 先决条件: 我已经知道将文件放在哪里,并且已经配置了log4j,并且正在进行控制台日志记录。 现在,我想登录到一个文件,并在程序运行后从文件系统中查找该文件。 需要添加到现有log4j中的行。属性是所需的输出 我为您准备了一个通用log4j.xml文件: <?xml version="1

我的故事:

我想制作一个尽可能简单的log4j记录器,将行记录到文件中。我发现了几个具有一些功能的示例,但不是一个真正起作用的基本、通用的示例,也没有一个解释了每一行是如何工作的

问题:

有人能提供吗

先决条件:

  • 我已经知道将文件放在哪里,并且已经配置了log4j,并且正在进行控制台日志记录。
  • 现在,我想登录到一个文件,并在程序运行后从文件系统中查找该文件。
  • 需要添加到现有
    log4j中的行。属性是所需的输出

我为您准备了一个通用log4j.xml文件:

<?xml version="1.0" encoding="iso-8859-1"?>
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd" >
<log4j:configuration debug="false">

    <appender name="default.console" class="org.apache.log4j.ConsoleAppender">
        <param name="target" value="System.out" />
        <param name="threshold" value="debug" />
        <layout class="org.apache.log4j.PatternLayout">
            <param name="ConversionPattern" value="%d{ISO8601} %-5p [%c{1}] - %m%n" />
        </layout>
    </appender>

    <appender name="default.file" class="org.apache.log4j.FileAppender">
        <param name="file" value="/log/mylogfile.log" />
        <param name="append" value="false" />
        <param name="threshold" value="debug" />
        <layout class="org.apache.log4j.PatternLayout">
            <param name="ConversionPattern" value="%d{ISO8601} %-5p [%c{1}] - %m%n" />
        </layout>
    </appender>

    <appender name="another.file" class="org.apache.log4j.FileAppender">
        <param name="file" value="/log/anotherlogfile.log" />
        <param name="append" value="false" />
        <param name="threshold" value="debug" />
        <layout class="org.apache.log4j.PatternLayout">
            <param name="ConversionPattern" value="%d{ISO8601} %-5p [%c{1}] - %m%n" />
        </layout>
    </appender>

    <logger name="com.yourcompany.SomeClass" additivity="false">
        <level value="debug" />
        <appender-ref ref="another.file" />
    </logger>

    <root>
        <priority value="info" />
        <appender-ref ref="default.console" />
        <appender-ref ref="default.file" />
    </root>
</log4j:configuration>

有关所有布局参数的描述,请参见此处:

这里有一个我经常使用的简单参数:

# Set up logging to include a file record of the output
# Note: the file is always created, even if there is 
# no actual output.
log4j.rootLogger=error, stdout, R

# Log format to standard out
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=   %5p\t[%d] [%t] (%F:%L)\n     \t%m%n\n

# File based log output
log4j.appender.R=org.apache.log4j.RollingFileAppender
log4j.appender.R.File=owls_conditions.log
log4j.appender.R.MaxFileSize=10000KB
# Keep one backup file
log4j.appender.R.MaxBackupIndex=1
log4j.appender.R.layout=org.apache.log4j.PatternLayout
log4j.appender.R.layout.ConversionPattern=   %5p\t[%d] [%t] (%F:%L)\n     \t%m%n\n
日志的格式如下:

ERROR   [2009-09-13 09:56:01,760] [main] (RDFDefaultErrorHandler.java:44)
        http://www.xfront.com/owl/ontologies/camera/#(line 1 column 1): Content is not allowed in prolog.
这种格式由字符串
%5p\t[%d][%t](%F:%L)\n\t%m%n\n
定义。您可以在中读取转换字符的含义

包含的注释应有助于理解它的功能。进一步说明:

  • 它记录到控制台和文件;在这种情况下,文件名为
    owls\u conditions.log
    :根据需要更改它
  • 文件达到10000KB时会进行旋转,并保留一个备份文件

    • 这是一个log4j.properties文件,我使用它非常成功

      logDir=/var/log/myapp
      
      log4j.rootLogger=INFO, stdout
      #log4j.rootLogger=DEBUG, stdout
      
      log4j.appender.stdout=org.apache.log4j.DailyRollingFileAppender
      log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
      log4j.appender.stdout.layout.ConversionPattern=%d{MM/dd/yyyy hh:mm:ss a}|%-5p|%-30c{1}| %m%n
      log4j.appender.stdout.DatePattern='.'yyyy-MM-dd
      log4j.appender.stdout.File=${logDir}/myapp.log
      log4j.appender.stdout.append=true
      
      DailyRollingFileAppender每天将创建新文件,文件名如下:

      myapp.log.2017-01-27
      myapp.log.2017-01-28
      myapp.log.2017-01-29
      myapp.log  <-- today's log
      
      使用
      -Dlog4j.configuration
      设置上述文件的位置,如中所述:

      在Java代码中,当实例化logger对象时,请确保设置每个软件组件的名称。我还喜欢记录日志文件和标准输出,所以我编写了这个小函数

      private static final Logger LOGGER = Logger.getLogger("Component1");
      
      public static void log(org.apache.log4j.Logger logger, String message) {
      
          logger.info(message);
          System.out.printf("%s\n", message);
      }
      
      public static String stackTraceToString(Exception ex) {
          StringWriter sw = new StringWriter();
          PrintWriter pw = new PrintWriter(sw);
          ex.printStackTrace(pw);
          return sw.toString();
      }
      
      然后这样称呼它:

      LOGGER.info(String.format("Exception occurred: %s", stackTraceToString(ex)));
      

      我还要求解释。例如,
      default file
      appender上的布局参数是做什么的?这是一种输出模式,那些%占位符决定记录什么信息以及如何设置这些信息的格式,看看我稍后将添加到回答中的链接,我几乎有类似的log4j.xml,但我仍然只在控制台中获取日志,而没有写入文件,尽管日志文件正在生成。只是想问一下这里要添加哪些依赖项和jar。我相信我的课堂上有一些矛盾的罐子。此外,为了获得所有类型的日志,比如信息、错误、调试等,在这个级别中应该有什么?在我的例子中,我只需要在类路径中有log4j.jar。除非您在代码和log4j或自定义appender之间使用facades,否则应该足够了。然后将指向代码路径的记录器级别设置为详细的级别,例如
      debug
      trace
      甚至
      all
      。并将文件追加器的
      threshold
      param设置为相同的值。应该授予哪些权限,以便日志真正进入文件。我几乎记不起过去的一些事情,至少对文件的文件权限应该是固定的,可能还有其他一些与程序相关的权限。我是在Linux中制作的。sample.log文件将在哪里创建?我认为这是一个很大的问题。在容器外部,我相信这会将日志文件放在
      CWD
      中,但是如果您在容器中配置日志,容器可能会将其放在其他地方。
      myapp.log.2017-01-27
      myapp.log.2017-01-28
      myapp.log.2017-01-29
      myapp.log  <-- today's log
      
      01/30/2017 12:59:47 AM|INFO |Component1   | calling foobar(): userId=123, returning totalSent=1
      01/30/2017 12:59:47 AM|INFO |Component2   | count=1 > 0, calling fooBar()
      
      java -Dlog4j.configuration=file:/home/myapp/config/log4j.properties com.foobar.myapp
      
      private static final Logger LOGGER = Logger.getLogger("Component1");
      
      public static void log(org.apache.log4j.Logger logger, String message) {
      
          logger.info(message);
          System.out.printf("%s\n", message);
      }
      
      public static String stackTraceToString(Exception ex) {
          StringWriter sw = new StringWriter();
          PrintWriter pw = new PrintWriter(sw);
          ex.printStackTrace(pw);
          return sw.toString();
      }
      
      LOGGER.info(String.format("Exception occurred: %s", stackTraceToString(ex)));