[英]How to append hostname to log file in log4j.xml
我想將主機名和日期附加到日志文件名。所以日志文件名應該像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
。我希望模式匹配。 提前致謝
首先從您的 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");
更新:
如果您的應用程序是 web 應用程序,那么需要在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
因為應用程序在啟動時,通過這個配置它會像 Context-listener 一樣跟隨它。
更新 2:
<logger name="packageName.AAA" additivity="false" >
<level value="INFO" />
<appender-ref ref="applog"/>
</logger>
您可以定義系統屬性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());
我發現${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 地址
編寫您自己的自定義 appender,擴展基本 appenderws。 這將幫助您操作 java 中的屬性。
請參閱此答案https://stackoverflow.com/a/1324075/1594992
或者像這個答案一樣簡單地設置命令行參數和系統屬性
試試這個: "${env:HOST}-${date:yyyy-MM-dd}"
Hostname + Date 。 在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"
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.