【问题标题】:How to append hostname to log file in log4j.xml如何将主机名附加到 log4j.xml 中的日志文件
【发布时间】:2016-03-23 06:10:14
【问题描述】:

我想将主机名和日期附加到日志文件名。所以日志文件名应该类似于 app_hostname.date.log注意:这应该在 linux 和 windows 中运行。

<appender name="applog" class="org.apache.log4j.DailyRollingFileAppender">
        <param name="File" value="${path}/app.log" />
        <param name="MaxFileSize" value="1MB" />
        <param name="DatePattern" value=".dd-MM-yyyy" />
        <layout class="org.apache.log4j.PatternLayout">
            <param name="ConversionPattern" value="[%d{dd-MM-yyyy HH:mm:ss}] [%-5p] %m%n"/>
        </layout>
</appender>

以及如何根据日志模式添加过滤器,而不是StringMatchFilter。我想要匹配模式。 提前致谢

【问题讨论】:

  • 考虑使用logbacklog4j2。从 logback 的 SiftingAppender 开始
  • @Nati,请更具体..如果可能,使用代码 sn-p

标签: java logging log4j logfile


【解决方案1】:

在 log4j2 documentation 之后,您可以进行环境变量查找,因此在类 Unix 系统中这应该可以工作:

<Property name="MYHOST">${env:HOSTNAME}</Property>
<Appenders>
  <File name="File1" fileName="${MYHOST}_file.log">
  ...
  </File>
</Appenders>

请注意 $HOSTNAME 在默认情况下并不总是可用,您可能需要在 shell 中显式导出它,请参阅this post

【讨论】:

    【解决方案2】:

    首先从您的 java 代码中执行此操作 然后 配置 log4j 到应用程序中,

    注意:在执行以下代码时处理或捕获所需的异常。

    // step-1 : set hostName into System's property, which will use by log4j
    System.setProperty("hostName", InetAddress.getLocalHost().getHostName()); 
    //step - 2 : set currentDate into System's property, which will use by log4j
    System.setProperty("currentDate", new SimpleDateFormat("dd-MMM-yyyy").format(new Date()));
    //step - 3 : now configure/load log4j into Application , if it's not still loaded earlier then.
    org.apache.log4j.Logger LOG = Logger.getLogger(YourJavaClassName.class); // ALERT : before this step above 2-step must needs to be execute, otherwise file-name won't appear as you required.
    
    //LOG.debug("anything whatever programmer what to log");
    

    更新:

    如果您的应用程序是网络应用程序, 然后需要在tomcat-server 启动之后和任何application 运行之前配置我们想要的属性,

    为此创建一个类ApplicationConfiguration,它实现了ServletContextListener 接口,这有助于在任何应用程序运行之前先运行。

    照样做,

    import java.net.InetAddress;
    import java.net.UnknownHostException;
    import java.text.SimpleDateFormat;
    import java.util.Date;
    
    import javax.servlet.ServletContextEvent;
    import javax.servlet.ServletContextListener;
    
    public class ApplicationConfiguration implements ServletContextListener{
    
        @Override
        public void contextDestroyed(ServletContextEvent arg0) {
            // TODO Auto-generated method stub
    
        }
    
        @Override
        public void contextInitialized(ServletContextEvent arg0) {
    
            try {
                // step-1 : set hostName into System's property, which will use by log4j
                System.setProperty("hostName", InetAddress.getLocalHost().getHostName());
                //step - 2 : set currentDate into System's property, which will use by log4j
                System.setProperty("currentDate", new SimpleDateFormat("dd-MMM-yyyy").format(new Date()));
            } catch (UnknownHostException e) {
                System.out.println("Error Message : " + e.getMessage());
                //e.printStackTrace();
            } 
    
    
        }
    
    
    }
    

    ......

    同样设置你的 log4j.xml 文件,

    <appender name="applog" class="org.apache.log4j.DailyRollingFileAppender">
            <param name="File" value="${path}/app_${hostName}.${currentDate}.log" />
            <param name="MaxFileSize" value="1MB" />
            <param name="DatePattern" value=".dd-MM-yyyy" />
            <layout class="org.apache.log4j.PatternLayout">
                <param name="ConversionPattern" value="[%d{dd-MM-yyyy HH:mm:ss}] [%-5p] %m%n"/>
            </layout>
    </appender>
    

    请相应地更新 web.xml 文件,

    <web-app ...>
       <listener>
        <listener-class>
                 com.pck1.ApplicationConfiguration
            </listener-class>
       </listener>
    </web-app>
    

    这个配置需要应用到web.xml,因为应用 启动时,通过此配置,它将像 上下文监听器。


    更新 2:

    <logger name="packageName.AAA" additivity="false" >
        <level value="INFO" />
        <appender-ref ref="applog"/>
     </logger>
    

    【讨论】:

    • 实际上 log4j 在应用程序启动时被调用。
    • @Sam 你的应用是网络应用吗?
    • 是的,它是一个网络应用程序...tomcat 是应用程序服务器
    • @Sam 参考我的“更新”部分
    • @Sam 一旦创建了类 ApplicationConfiguration(我的建议),则无需为设置主机名和 currentDate 设置上述两步,因为它由 ApplicationConfiguration - 类本身处理。
    【解决方案3】:

    我发现默认情况下只有 ${hostName} 适用于最新的 log4j

    类似这样的:

        <File name="file" fileName="${baseDir}/${hostName}-file.log" append="true">
    

    这在此处记录: https://logging.apache.org/log4j/2.x/manual/configuration.html#AutomaticConfiguration

    默认属性部分:

    默认映射预先填充了 "hostName" 的值,即当前系统的主机名或 IP 地址

    【讨论】:

      【解决方案4】:

      以下配置即可解决问题

      <appender name="file" class="org.apache.log4j.RollingFileAppender">
              <param name="append" value="false" />
              <param name="maxFileSize" value="10MB" />
              <param name="maxBackupIndex" value="10" />
              <param name="file" value="C:\\Users\\kavurira\\Desktop\\log4j-${HostName}.log" />
              <layout class="org.apache.log4j.PatternLayout">
              <param name="ConversionPattern" 
                  value="%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m${HostName}%n" />
              </layout>
          </appender>
      
      Just set "HostName" as system property, before initialization of Log4j.
      
      System.setProperty("HostName", InetAddress.getLocalHost().getHostName());
      

      【讨论】:

      • 在哪里设置主机名属性,我没有任何 servlet(启动时加载)...?
      • 启动时不需要加载,必须登录或启动您的项目对吗?您必须在项目中设置属性,然后在项目中执行以下行 Logger logger = Logger.getLogger("classname")
      • 我试过了......但在我的情况下,日志文件是在应用程序启动时生成的......所以它没有取名
      • 告诉我您使用的是哪个应用服务器?
      【解决方案5】:

      您可以定义系统属性hostname 并更改配置:

      <param name="File" value="${path}/app_${hostname}.log" />
      

      确保在 log4j 初始化之前设置系统属性。

      添加过滤器请参考Filter log by matching pattern - log4j的回答

      更新: 写不同日志的简单解决方案:

      <logger name="com"><!-- for Class Package is com.???... -->
          <level value="INFO" />
          <appender-ref ref="applog" />
      </logger>
      <logger name="loggerForCustomClass">
          <level value="INFO" />
          <appender-ref ref="customlog" />
      </logger>
      

      更改程序中的代码:

      //message will write to "customlog" appender
      Logger.getLogger("loggerForCustomClass").info("log from custom class");
      
      //message will write to "applog" appender
      Logger.getLogger(getClass()).info("log from other class");
      

      【讨论】:

      • 感谢您的回答,但对我来说主要问题是我有两个日志用于同一个包,但如果它来自我的自定义类,它应该写入一个日志,如果它来自其他日志它应该写给另一个类。
      【解决方案6】:

      参照。这个response 到一个类似的问题,即使根据这个邮件列表thread,这个请求也不会很明显可以满足,这是一个长期存在的请求。

      使用最新版本的 log4j,本文档末尾 section 似乎您已经拥有使用属性的功能。

      无论如何,您始终可以使用专门的模式布局自己完成,例如 here

      【讨论】:

      • 感谢您的回答,但对我来说主要问题是我有两个日志用于同一个包,但如果它来自我的自定义类,它应该写入一个日志,如果它来自其他日志它应该写给另一个类。
      【解决方案7】:

      编写你自己的扩展基本 appenderws 的自定义 appender。这将帮助您在 java 中操作属性。

      看到这个答案https://stackoverflow.com/a/1324075/1594992

      或者只需像这个答案一样设置命令行参数和系统属性

      https://stackoverflow.com/a/4953207/1594992

      【讨论】:

      • log4j 会在应用启动时加载,如何通过 system.setProperty 定义
      • 怎么称呼log4j,有基类吗?如果是这样,您可以在那里设置属性
      • Log4j 在 spring boot 之后正在初始化。INFO: Initializing Spring root WebApplicationContext log4j:WARN
      【解决方案8】:

      试试这个:"${env:HOST}-${date:yyyy-MM-dd}" 主机名 + 日期。在yaml:

      Properties:
          Property:
            - name: log-path
              value:  "logs"
            - name: filePattern
              value:  "${env:HOST}-${date:yyyy-MM-dd}"
      
        Appenders:
      
          Console:
            name: Console_Appender
            target: SYSTEM_OUT
            PatternLayout:
              pattern: "[%-5level] %d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %c{1} - %msg%n"
      
          File:
            name: File_Appender
            fileName: "${log-path}/filelog-${filePattern}.log"
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-08-31
        • 2011-07-10
        • 2019-05-02
        • 2014-11-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多