前段時間由於需要將項目部署到服務器,由於習慣了打印到控制檯DEBUG追蹤,部署到服務器後發現光關控制檯信息很難追蹤到問題所在,並且控制檯還不能複製打印的信息,所以下定決心自己將項目的日誌輸出到自己能夠隨時查看的文件夾中。
Log4j由三個重要的組件構成:日誌信息的優先級,日誌信息的輸出目的地,日誌信息的輸出格式。日誌信息的優先級從高到低有ERROR、WARN、INFO、DEBUG、ALL,分別用來指定這條日誌信息的重要程度;日誌信息的輸出目的地指定了日誌將打印到控制檯還是文件中;而輸出格式則控制了日誌信息的顯示內容。
一、首先你有一個Web項目 其次你得準備好log4j的依賴包 log4j-1.2.15.jar commons-logging-1.0.4.jar 分別測試了下 2個依賴包缺一不可,否則就會報錯。
二、在你的項目根目錄下的WEB-INF 新建log4j配置 取名log4j.properties 位置和文件名你都可以重新指定,只要在後續配置下能夠根據路徑找到這個配置就行。一般採取約定熟成的方式。
log4j.rootLogger = [ level ] , appenderName1,appenderName2, …
1. rootLogger 指的是配置log4j level 包括了5種 文章開始指明 這裏意思只打印 INFO 級別以上的信息。
appenderName1 appenderName2
... 指的將日誌信息輸出到哪個地方 由下面具體指定
2.appender具體指定將日誌信息打印在哪
1.org.apache.log4j.ConsoleAppender(控制檯),
2.org.apache.log4j.FileAppender(文件),
3.org.apache.log4j.DailyRollingFileAppender(每天產生一個日誌文件),
4.org.apache.log4j.RollingFileAppender(文件大小到達指定尺寸的時候產生一個 新的文件)
5.org.apache.log4j.WriterAppender(將日誌信息以流格式發送到任意指定的地方)
3.layout 配置日誌信息的格式(佈局)
1.org.apache.log4j.HTMLLayout(以HTML表格形式佈局),
2.org.apache.log4j.PatternLayout(可以靈活地指定佈局模式),
3.org.apache.log4j.SimpleLayout(包含日誌信息的級別和信息字符串),
4.org.apache.log4j.TTCCLayout(包含日誌產生的時間、線程、類別等等信息)
具體log4j配置網上一搜一大把,這裏就不再贅述了。下面是我的配置的具體含義
log4j.rootLogger=info,ServerDailyRollingFile,stdout log4j.appender.ServerDailyRollingFile=org.apache.log4j.DailyRollingFileAppender
log4j.appender.ServerDailyRollingFile.DatePattern='.'yyyy-MM-dd
log4j.appender.ServerDailyRollingFile.File=D:/hang222/hlserverlogs/hlserver.log log4j.appender.ServerDailyRollingFile.layout=org.apache.log4j.PatternLayout
log4j.appender.ServerDailyRollingFile.layout.ConversionPattern=%d - %m%n
log4j.appender.ServerDailyRollingFile.Append=true
log4j.appender.stdout=org.apache.log4j.ConsoleAppender log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %p [%c] %m%n
1.1ServerDailyRollingFile=org.apache.log4j.DailyRollingFileAppender 每天產生一個日誌文件 以及在後續定義了打印日誌時間的格式和日誌的路徑,其中路徑你可以採用相對路徑 其中只需要修改D:/hang213/hlserverlogs/hlserver.log,
1.1.1普通相對路徑:
log4j.appender.logfile.File=../logs/app.log,將日誌記錄到tomcat下的logs文件夾;
1.1.2環境變量的相對路徑:(其他需要可以自行網上搜索)通過在程序裏打印可以定位到你想的位置
System.out.println("Java運行時環境版本:/n"+System.getProperty("java.version"));
log4j.appender.logfile.File=${user.dir}/logs/app.log,使用tomcat容器時${user.dir}對應tomcat的bin目錄;
1.2
stdout= org.apache.log4j.ConsoleAppender 打印在控制檯
} catch (IOException e) {
e.printStackTrace();
}
System.err.println("初始化log4j日誌組件");
}
}
三、在Web.xml配置log4j
用於項目自動加載log4j的配置
<!-- 加載Log4J 配置文件 -->
<context-param>
<param-name>log4jConfigLocation</param-name>
<param-value>WEB-INF/log4j.properties</param-value>
</context-param>
<context-param>
<param-name>log4jRefreshInterval</param-name>
<param-value>3000</param-value>
</context-param>
<listener>
<listener-class>org.springframework.web.util.Log4jConfigListener</listener-class>
</listener>
項目在運行時就會根據設置的路徑將log4j的配置加載,log4jRefreshInterval這是設置每3秒掃描查看配置是否發生變化,等同於動態加載,不過一般不需要可以去掉,上面使用監聽器,當然也可以servlet實現,原理相同:只需將listener換成servlet
<servlet>
<servlet-name>log4j</servlet-name>
<servlet-class>
org.springframework.web.util.Log4jConfigServlet
</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
到此 我們的log4j就配置完成了,在項目中需要打印日誌的方法時:
private static Logger logger = Logger.getLogger(類名.class);
logger.info("打印的日誌"+需要打印的參數等);
到此over 查看下完成沒有:控制檯
文件:
當然由於配置了
DatePattern 你的前面日誌文件會自動生成
hlserver.log.2017-10-18
我瞭解的還有一種就是通過servlet初始化init()方法中加載file屬性實現相對路徑
原理相同 寫一個類 用於加載log4j的配置 並在WEB.xml配置這個類並加載他。
/WEB-INF/config/log4j.properties
log4j.appender.AFile=org.apache.log4j.DailyRollingFileAppender
log4j.appender.AFile.DatePattern='.'yyyy-MM-dd'.html'
log4j.appender.AFile.File=..//webapps//logs//d1cm_log.html
log4j.appender.AFile.layout=org.apache.log4j.HTMLLayout
log4j.appender.AFile.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %p %c %m %n
com.lq.utils.ConfigServlet.java
public
class ConfigServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
public void init(ServletConfig config) throws ServletException {
super.init(config);
//初始化log4j日誌組件
initLogConfig(config);
}
private void initLogConfig(ServletConfig config) {
String prifix = getServletContext().getRealPath("/");
//System.out.println(prifix);
//獲取log4j配置文件地址
String Log4jFile = config.getInitParameter("Log4jFile");
//System.out.println(Log4jFile);
String filePath = prifix + Log4jFile;
//System.out.println(filePath);
PropertyConfigurator.configure(filePath);
Properties props = new Properties();
/* try {
String Log4jFileSavePath = config.getInitParameter("Log4jFileSavePath");
//System.out.println(Log4jFileSavePath);
FileInputStream log4jStream = new FileInputStream(filePath);
props.load(log4jStream);
log4jStream.close();
//設置日誌保存地址
String logFile = prifix + Log4jFileSavePath + File.separator + "d1cm_log.html" ;
//System.out.println(logFile);
props.setProperty("log4j.appender.AFile.File", logFile);
PropertyConfigurator.configure(props); //裝入log4j配置信息
} catch (IOException e) {
e.printStackTrace();
}*/
System.err.println("初始化log4j日誌組件");
}
}
web.xml
<!-- 系統初始化配置信息 servlet -->
<servlet>
<servlet-name>configServlet</servlet-name>
<servlet-class>com.common.config.ConfigServlet</servlet-class>
<init-param>
<param-name>Log4jFile</param-name>
<param-value>/WEB-INF/config/log4j.properties</param-value>
</init-param>
<init-param>
<param-name>Log4jFileSavePath</param-name>
<param-value>/logs</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
第三種照着這個網址實現:也就沒怎麼研究了,大同小異,都是將配置加載
http://blog.csdn.net/longaohun/article/details/6233099
實現完了發現控制檯還好,日誌文件中每次啓動重新啓動項目就老是顯示很多不需要的信息,嚴重干擾了閱讀查錯,
網站上找了半天解決辦法,什麼不打印Spring的相關等,最後幡然醒悟,你將一個成熟的項目部署到服務器後,很少會不斷的重啓服務,自己想多了。。。。。不知道會不會有人和我一樣陷入怪圈。