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

时间:2011-06-15 13:56:25

标签: java logging log4j

我的故事:

我想制作一个简单的事情,就像将日志记录到文件中的最简单的log4j记录器一样。我找到了一些带有一些功能的例子,但不是一个真正有用的基本的,一般的,而不是一个解释每行如何工作的例子。

问题:

有人可以提供吗?

先决条件:

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

4 个答案:

答案 0 :(得分:77)

我有一个通用的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>

使用一个控制台,两个文件追加器和一个记录器,使用第二个文件appender而不是第一个。

修改

在其中一个较旧的项目中,我找到了一个简单的log4j.properties文件:

# For the general syntax of property based configuration files see
# the documentation of org.apache.log4j.PropertyConfigurator.

# The root category uses two appenders: default.out and default.file.
# The first one gathers all log output, the latter only starting with 
# the priority INFO.
# The root priority is DEBUG, so that all classes can be logged unless 
# defined otherwise in more specific properties.
log4j.rootLogger=DEBUG, default.out, default.file

# System.out.println appender for all classes
log4j.appender.default.out=org.apache.log4j.ConsoleAppender
log4j.appender.default.out.threshold=DEBUG
log4j.appender.default.out.layout=org.apache.log4j.PatternLayout
log4j.appender.default.out.layout.ConversionPattern=%-5p %c: %m%n

log4j.appender.default.file=org.apache.log4j.FileAppender
log4j.appender.default.file.append=true
log4j.appender.default.file.file=/log/mylogfile.log
log4j.appender.default.file.threshold=INFO
log4j.appender.default.file.layout=org.apache.log4j.PatternLayout
log4j.appender.default.file.layout.ConversionPattern=%-5p %c: %m%n

有关所有布局参数的说明,请在此处查看:log4j PatternLayout arguments

答案 1 :(得分:30)

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">

<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/" debug="false">

   <appender name="fileAppender" class="org.apache.log4j.RollingFileAppender">
      <param name="Threshold" value="INFO" />
      <param name="File" value="sample.log"/>
      <layout class="org.apache.log4j.PatternLayout">
         <param name="ConversionPattern" value="%d %-5p  [%c{1}] %m %n" />
      </layout>
   </appender>

  <root> 
    <priority value ="debug" /> 
    <appender-ref ref="fileAppender" /> 
  </root> 

</log4j:configuration>

Log4j可能有点令人困惑。所以让我们试着了解这个文件中发生了什么: 在log4j中,您有两个基本构造appender和logger。

Appenders 定义附加内容的方式和位置。它会被记录到文件,控制台,数据库等吗?在这种情况下,您指定使用布局标记中指定的模式将指向fileAppender的日志语句放入文件sample.log中。您可以轻松地为控制台或数据库创建一个appender。控制台appender将在屏幕上指定类似布局的内容,数据库appender将具有连接详细信息和表名称。

记录程序会在记录事件冒出时对其进行响应。如果事件捕获了特定记录器的兴趣,它将调用其附加的appender。在下面的示例中,只有一个记录器是根记录器 - 默认情况下会响应所有记录事件。除根记录器外,您还可以指定更具体的记录器,以响应特定包中的事件。这些记录器可以使用appender-ref标记指定自己的appender,否则将从根记录器继承appender。使用更具体的记录器可以微调特定包上的日志记录级别或将某些包定向到其他appender。

所以这个文件说的是:

  1. 创建一个记录到的fileAppender file sample.log
  2. 将该appender附加到根目录 记录器。
  3. 根记录器将响应任何 事件至少详细如下 'debug'level
  4. appender仅配置为 记录至少为的事件 详细信息为'info'
  5. 如果您的代码中有logger.debug("blah blah"),则会被忽略。 logger.info("Blah blah");将输出到sample.log。

    下面的代码段可以使用 log4j 标记添加到上面的文件中。此记录器将从<root>继承appender,但会将包org.springframework中的所有日志记录事件限制为在info级或更高级别记录的事件。

      <!-- Example Package level Logger -->
        <logger name="org.springframework">
            <level value="info"/>
        </logger>   
    

答案 2 :(得分:10)

这是我经常使用的一个简单的:

# 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定义。您可以在log4j javadoc for PatternLayout中阅读转换字符的含义。

包含的评论应该有助于理解它的作用。补充说明:

  • 它记录到控制台和文件;在这种情况下,文件名为owls_conditions.log:根据您的需要进行更改;
  • 文件在达到10000KB时轮换,并保留一个备份文件

答案 3 :(得分:2)

这是我用过的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

日志文件中的每个条目都将采用以下格式:

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()

使用-Dlog4j.configuration中提到的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();
}

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

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

然后这样称呼它:

/* reset and basic makup */
ul {
  padding:2em;
  }
li {
  background:lightgray;
  display: block;
  overflow: hidden;
  margin: 3px;
}
a {
  display:inline-block;
  text-decoration:none;
  text-align:left;
  color:green
  }

.menu-label.coming-soon:before {/* include image*/
  display: inline-block;
  content: url(http://dummyimage.com/40x20/abc/f00&text=soon);
  width: 40px;
  height: 20px;
  vertical-align: middle;
}

/* float first element and align right text */
li.float {
  text-align: right;
}
a.float {
  float: left;
}
/* end float */

    /*=== */

/* flex & justify-content */

.flex {
  display: flex;
  justify-content: space-between;
}
/* end flex */

    /*=== */

/* text-align */

.justify, .justifyli{
  display: block;
  text-align: justify;
  line-height:0em;
}
[class^="justify"]:after {
  content: '';
  display: inline-block;
  vertical-align: top;
  width: 99%;
}
/* end  text-align */