如何将主机名附加到 log4j.xml 中的日志文件

How to append hostname to log file in log4j.xml

我想将主机名和日期附加到日志文件 name.So 日志文件名称应类似于 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。我希望匹配模式。 提前致谢

比照。这个response to a similar question, the request wouldn't be obvious to satisfy, even if according to this mailing-list thread,这是一个长期的请求。

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

无论如何,您总是有自己的解决方案,可以使用专门的图案布局,例如 here

您可以定义一个系统 属性 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");

下面的配置就可以了

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

编写您自己的自定义 appender,扩展基本的 appenderws。这将帮助您操作 java.

中的属性

查看此答案

或者简单地设置命令行参数和系统 属性 就像这个答案

首先从您的 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 运行,

之前配置我们想要的 属性

为此创建一个 class 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>

This configuration need to apply into web.xml because application when start, by this configuration it will follow it like Context-listener.


更新 2:

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

按照 log4j2 documentation 你可以进行环境变量查找,所以在类 Unix 系统中这应该可以工作:

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

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

试试这个:"${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"

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

像这样:

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

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

默认属性部分:

The default map is pre-populated with a value for "hostName" that is the current system's host name or IP address