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

Pra*_*mar 9 java logging log4j logfile

我想将主机名和日期附加到日志文件名.所以日志文件名称应该像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>
Run Code Online (Sandbox Code Playgroud)

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

Jos*_*rte 8

按照 log4j2文档,您可以进行环境变量查找,因此在类 Unix 系统中,这应该可以工作:

<Property name="MYHOST">${env:HOSTNAME}</Property>
<Appenders>
  <File name="File1" fileName="${MYHOST}_file.log">
  ...
  </File>
</Appenders>
Run Code Online (Sandbox Code Playgroud)

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


Ng *_*ong 6

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

像这样的事情:

    <File name="file" fileName="${baseDir}/${hostName}-file.log" append="true">
Run Code Online (Sandbox Code Playgroud)

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

默认属性部分:

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


vis*_*era 5

首先从您的 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");
Run Code Online (Sandbox Code Playgroud)

更新 :

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

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

也这样做,

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


    }


}
Run Code Online (Sandbox Code Playgroud)

......

同样设置你的 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>
Run Code Online (Sandbox Code Playgroud)

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

<web-app ...>
   <listener>
    <listener-class>
             com.pck1.ApplicationConfiguration
        </listener-class>
   </listener>
</web-app>
Run Code Online (Sandbox Code Playgroud)

这个配置需要应用到web.xml因为应用程序启动时,通过这个配置它会像Context-listener一样跟随它。


更新 2:

<logger name="packageName.AAA" additivity="false" >
    <level value="INFO" />
    <appender-ref ref="applog"/>
 </logger>
Run Code Online (Sandbox Code Playgroud)