首頁 Java java教程 Java日誌軟體Log4j的基本使用教學課程

Java日誌軟體Log4j的基本使用教學課程

Jan 18, 2017 pm 01:08 PM

1.概述
1.1背景
在我們的日常開發中,日誌記錄非常重要。在應用程式中加入日誌記錄總的來說基於三個目的:監視程式碼中變數的變化情況,週期性的記錄到檔案中供其他應用進行統計分析工作;追蹤程式碼運行時軌跡,作為日後審計的依據;擔當整合開發環境中的偵錯器的作用,向文件或控制台列印程式碼的偵錯資訊。

1.2簡介
Log4j(log for java)是Apache的一個開放原始碼項目,它提供了一種細膩的日誌管理方式。透過一個設定文件,我們可以多選擇的控制每個日誌的輸出格式和目的地。透過定義訊息的級別,我們也可以靈活開關代碼中的回饋訊息。簡單的說log4j就是幫助開發人員進行日誌輸出管理的API類別庫。它最重要的特點就可以設定檔靈活的設定日誌資訊的優先順序、日誌資訊的輸出目的地以及日誌資訊的輸出格式。

2.log4j配置
2.1log4j的類別圖

Java日誌軟體Log4j的基本使用教學課程

 Logger -日誌寫出器,供程式設計師輸出日誌資訊

Appender -日誌目的地,把格式化好的資訊輸出到指定的地方日誌去

ConsoleAppender -目的地為控制台的Appender

FileAppender -目的地為文件的Appender

RollingFileAppender -目的地為大小受限的文件的Appender

Layout -日誌程式碼的logging request格式化成字串

 PatternLayout -用指定的pattern格式化logging request的Layout

2.2定義設定檔
Log4j可以透過java程式動態設置,該方式明顯缺點是:如果需要修改日誌輸出等級等資訊,則必須修改java文件,然後重新編譯,很麻煩。


使用設定檔將使我們的應用程式更有彈性地配置log,日誌輸出方式包括輸出優先權、輸出目的地、輸出格式。 Log4j支援兩種設定檔格式,一種是XML格式的文件,一種是Java特性檔log4j.properties(鍵=值)。

n xml檔

n properties檔案(建議使用)

2.3設定檔log4j.properties
第一次呼叫到Log4J時,Log4J會在類別路徑(../web-inf/class/當然也可以呼叫到Log4J時,Log4J會在類別路徑(../web-inf/class/當然也可以放到其它任何目錄,只要該目錄被包含到類路徑中即可)中定位這個文件,並讀入這個文件完整的配置。這個設定檔告訴Log4J以什麼樣的格式、把什麼樣的資訊、輸出到什麼地方。對應的,我們需要配置3個方面的內容:

1、根目錄(等級和目的地);

2、目的地(控制台、文件等等);

3、輸出樣式(何種方式顯示日誌內容)


範例如下:

#設定日誌輸出等級

log4j.rootLogger=debug,appender1

#輸出到控制台

#樣式為TTCCLayout

log4j.appender.appender1.layout=org.apache.log4j.TTCCLayout

2.4.log4j三組件說明

Log4j有三個主要的組件:Loggers()記錄器記錄器),Appender (輸出來源) Layout(佈局)。綜合使用這三個元件可以輕鬆的記錄資訊的類型和級別,並可以在運行時控制日誌輸出的樣式和位置。以下對三個元件分別進行說明:


2.4.1日誌記錄器Logger

Logger物件是用來取代System.out或System.err的日誌寫出器,用來供程式設計師輸出日誌資訊。

配置根Logger,語法為:

log4j.rootLogger = [ level ] , appenderName, appenderName,…

其中,level 是日誌記錄的優先級,分為OFF、FATAL、ERROR、WARB、INFO 、ALL或自訂的等級。 Log4j建議只使用四個級別,優先權從高到低分別是ERROR、WARN、INFO、DEBUG。透過在這裡定義的級別,您可以控製到應用程式中相應級別的日誌資訊的開關。例如在這裡定義了INFO級別,則應用程式中所有DEBUG級別的日誌資訊將不會列印出來。 appenderName就是指定日誌資訊輸出到哪個地方。可同時指定多個輸出目的地。

2.4.2輸出目的地Appender

Log4j日誌系統允許把日誌輸出到不同的地方,例如控制台(Console)、檔案(Files)、根據天數或檔案大小產生新的檔案、以串流的形式傳送到其它地方等等。

配置appender,其語法表示為:

log4j.appender.appenderName = fully.qualified.name.of.appender.class
log4j.appender.appenderName.option1 = value1
…
log4j.appender.appenderName.option = valueN
登入後複製

"fully.qualified.name.of.appender.class"可以指定下面五个目的地中的一个:
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(将日志信息以流格式发送到任意指定的地方)
(1).ConsoleAppender选项

Threshold=WARN:指定日志消息的输出最低层次。

ImmediateFlush=true:默认值是true,意谓着所有的消息都会被立即输出。

Target=System.err:默认情况下是:System.out,指定输出控制台

(2).FileAppender 选项

Threshold=WARN:指定日志消息的输出最低层次。

ImmediateFlush=true:默认值是true,意谓着所有的消息都会被立即输出。

File=mylog.log:指定消息输出到mylog.log文件。

Append=false:默认值是true,即将消息增加到指定文件中,false指将消息覆盖指定的文件内容。

(3).DailyRollingFileAppender 选项

Threshold=WARN:指定日志消息的输出最低层次。

ImmediateFlush=true:默认值是true,意味着所有的消息都会被立即输出。

File=mylog.log:指定消息输出到mylog.log文件。

Append=false:默认值是true,即将消息增加到指定文件中,false指将消息覆盖指定的文件内容。

DatePattern='.'yyyy-ww:每周滚动一次文件,即每周产生一个新的文件。当然也可以指定按月、周、天、时和分。

即对应的格式如下:
1)'.'yyyy-MM: 每月
2)'.'yyyy-ww: 每周
3)'.'yyyy-MM-dd: 每天
4)'.'yyyy-MM-dd-a: 每天两次
5)'.'yyyy-MM-dd-HH: 每小时
6)'.'yyyy-MM-dd-HH-mm: 每分钟
4.RollingFileAppender 选项

Threshold=WARN:指定日志消息的输出最低层次。

ImmediateFlush=true:默认值是true,意味着所有的消息都会被立即输出。

File=mylog.log:指定消息输出到mylog.log文件。

Append=false:默认值是true,即将消息增加到指定文件中,false指将消息覆盖指定的文件内容。

MaxFileSize=100KB: 后缀可以是KB, MB或者是 GB.在日志文件到达该大小时,将会自动滚动,即将原来的内容移到mylog.log.1文件。

MaxBackupIndex=2:指定可以产生的滚动文件的最大数。

2.4.3格式(布局)Layout

有时希望根据自己的喜好格式化自己的日志输出。Log4j可以在Appender的后面附加Layout来完成这个功能。

配置Layout,其语法表示为:

log4j.appender.appenderName.layout =fully.qualified.name.of.layout.class
log4j.appender.appenderName.layout.option1 = value1
…
log4j.appender.appenderName.layout.option = valueN
登入後複製

Layout提供了四种日志输出样式,如下所示:

(1).org.apache.log4j.HTMLLayout(以HTML表格形式布局),
(2).org.apache.log4j.PatternLayout(可以灵活地指定布局模式),
(3).org.apache.log4j.SimpleLayout(包含日志信息的级别和信息字符串),
(4).org.apache.log4j.TTCCLayout(包含日志产生的时间、线程、类别等等信息)

HTMLLayout 选项
LocationInfo=true:默认值是false,输出java文件名称和行号
Title=my app file: 默认值是 Log4J Log Messages.
2.PatternLayout 选项
ConversionPattern=%m%n :指定怎样格式化指定的消息。

这里需要说明的就是日志信息格式中几个符号所代表的含义:

-x号:x信息输出时左对齐

%p: 输出日志信息优先级,即DEBUG,INFO,WARN,ERROR,FATAL,

%d: 输出日志时间点的日期或时间,默认格式为ISO8601,也可以在其后指定格式,比如:%d{yyy MMM dd HH:mm:ss,SSS},输出类似:2002年10月18日22:10:28,921

%r: 输出自应用启动到输出该log信息耗费的毫秒数

%c: 输出日志信息所属的类目,通常就是所在类的全名

%t: 输出产生该日志事件的线程名

%l: 输出日志事件的发生位置,相当于%C.%M(%F:%L)的组合,包括类目名、发生的线程,以及在代码中的行数。举例:Testlog4.main(TestLog4.java:10)

%x: 输出和当前线程相关联的NDC(嵌套诊断环境),尤其用到像java servlets这样的多客户多线程的应用中。

%%: 输出一个"%"字符

%F: 输出日志消息产生时所在的文件名称

%L: 输出代码中的行号

%m: 输出代码中指定的消息,产生的日志具体信息

%n: 输出一个回车换行符

可以在%与模式字符之间加上修饰符来控制其最小宽度、最大宽度、和文本的对齐方式。如:

1)%20c:指定输出category的名称,最小的宽度是20,如果category的名称小于20的话,默认的情况下右对齐。
2)%-20c:指定输出category的名称,最小的宽度是20,如果category的名称小于20的话,"-"号指定左对齐。
3)%.30c:指定输出category的名称,最大的宽度是30,如果category的名称大于30的话,就会将左边多出的字符截掉,但小于30的话也不会有空格。
4)%20.30c:如果category的名称小于20就补空格,并且右对齐,如果其名称长于30字符,就从左边把多出的字符截掉。

2.5.log4j配置示例
LOG4J的配置之简单使它遍及于越来越多的应用中:Log4J配置文件实现了输出到控制台、文件、回滚文件、发送日志邮件、输出到数据库日志表、自定义标签等全套功能。

log4j.rootLogger=DEBUG,CONSOLE,A1,im
log4j.addivity.org.apache=true
登入後複製

n 应用于控制台

log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender
log4j.appender.Threshold=DEBUG
log4j.appender.CONSOLE.Target=System.out
log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout
log4j.appender.CONSOLE.layout.ConversionPattern=%d-%c-%-4r[%t]%-5p%c%x-%m%n
登入後複製

n 应用于文件

log4j.appender.FILE=org.apache.log4j.FileAppender
log4j.appender.FILE.File=file.log
log4j.appender.FILE.Append=false
log4j.appender.FILE.layout=org.apache.log4j.PatternLayout
log4j.appender.FILE.layout.ConversionPattern=%d - %c -%-4r [%t] %-5p %c %x - %m%n
登入後複製

n 应用于文件回滚

log4j.appender.ROLLING_FILE=org.apache.log4j.RollingFileAppender
log4j.appender.ROLLING_FILE.Threshold=ERROR
log4j.appender.ROLLING_FILE.File=rolling.log
log4j.appender.ROLLING_FILE.Append=true
log4j.appender.ROLLING_FILE.MaxFileSize=10KB
log4j.appender.ROLLING_FILE.MaxBackupIndex=1
log4j.appender.ROLLING_FILE.layout=org.apache.log4j.PatternLayout
log4j.appender.ROLLING_FILE.layout.ConversionPattern=%d - %c -%-4r [%t] %-5p %c %x - %m%n
登入後複製

n 应用于socket

log4j.appender.SOCKET=org.apache.log4j.RollingFileAppender
log4j.appender.SOCKET.RemoteHost=localhost
log4j.appender.SOCKET.Port=5001
log4j.appender.SOCKET.LocationInfo=true
log4j.appender.SOCKET.layout=org.apache.log4j.PatternLayout
log4j.appender.SOCET.layout.ConversionPattern=[start]%d{DATE}[DATE]%n%p[PRIORITY]%n%x[NDC]%n%t[THREAD]%n%c[CATEGORY]%n%m[MESSAGE]%n%n
# Log Factor 5 Appender
log4j.appender.LF5_APPENDER=org.apache.log4j.lf5.LF5Appender
log4j.appender.LF5_APPENDER.MaxNumberOfRecords=2000
登入後複製

n 发送日志给邮件

log4j.appender.MAIL=org.apache.log4j.net.SMTPAppender
log4j.appender.MAIL.Threshold=FATAL
log4j.appender.MAIL.BufferSize=10
log4j.appender.MAIL.From=web@www.wuset.com
log4j.appender.MAIL.SMTPHost=www.wusetu.com
log4j.appender.MAIL.Subject=Log4J Message
log4j.appender.MAIL.To=web@www.wusetu.com
log4j.appender.MAIL.layout=org.apache.log4j.PatternLayout
log4j.appender.MAIL.layout.ConversionPattern=%d-%c-%-4r[%t]%-5p%c%x-%m%n
登入後複製

n 用于数据库

log4j.appender.DATABASE=org.apache.log4j.jdbc.JDBCAppender
log4j.appender.DATABASE.URL=jdbc:mysql://localhost:3306/test
log4j.appender.DATABASE.driver=com.mysql.jdbc.Driver
log4j.appender.DATABASE.user=root
log4j.appender.DATABASE.password=
log4j.appender.DATABASE.sql=INSERT INTO LOG4J (Message) VALUES ('%d - %c -%-4r [%t] %-5p %c %x - %m%n')
log4j.appender.DATABASE.layout=org.apache.log4j.PatternLayout
log4j.appender.DATABASE.layout.ConversionPattern=%d-%c-%-4r[%t]%-5p%c%x-%m%n
log4j.appender.A1=org.apache.log4j.DailyRollingFileAppender
log4j.appender.A1.File=SampleMessages.log4j
log4j.appender.A1.DatePattern=yyyyMMdd-HH'.log4j'
log4j.appender.A1.layout=org.apache.log4j.xml.XMLLayout
登入後複製

n 自定义Appender

log4j.appender.im = net.cybercorlin.util.logger.appender.IMAppender
 
log4j.appender.im.host = mail.cybercorlin.net
log4j.appender.im.username = username
log4j.appender.im.password = password
log4j.appender.im.recipient = corlin@cybercorlin.net
 
log4j.appender.im.layout=org.apache.log4j.PatternLayout
log4j.appender.im.layout.ConversionPattern =[framework] %d - %c -%-4r [%t] %-5p %c %x - %m%n
登入後複製

3.在WEB应用中为SPRING配置Log4j
首先需要在web.xml文件中加入下面的配置语句:

<!-- 为避免项目间冲突,定义唯一的 webAppRootKey-->
<context-param>
  <param-name>webAppRootKey</param-name>
  <param-value>myProject.root</param-value>
</context-param>
<!-- 加载log4j的配置文件log4j.properties -->
<context-param>
  <param-name>log4jConfigLocation</param-name>
  <param-value>/WEB-INF/classes/config/log4j/log4j.properties</param-value>
</context-param>
  <!-- 设定刷新日志配置文件的时间间隔,这里设置为60s -->
<context-param>
  <param-name>log4jRefreshInterval</param-name>
  <param-value>60000</param-value>
</context-param>
  
<!-- 加载Spring框架中的log4j监听器Log4jConfigListener -->
<listener>
  <listener-class>org.springframework.web.util.Log4jConfigListener</listener-class>
</listener>
登入後複製

属性log4jConfigLocation的值建议还是设置为:/WEB-INF/classes/log4j.properties,这样我们在不启动web应用的时候,做一些测试就能够正确地记录日志信息。Log4jConfigListener是spring提供的工具类,它开启一个log4j的监视线程,并每60(log4jRefreshInterval变量定义)秒检测日志配置变化,从而不需要每次重新启动web服务来应用新的配置。在tomcat中没有根据web应用来分开系统属性。所以必须为每一个web应用定义唯一的"webAppRootKey",我们取名为webApp.root.在启动环境后,Log4jConfigListener会将值注入到webApp.root变量。

4.在代码中使用Log4j
4.1.得到记录器
使用Log4j,第一步就是要获取日志记录器,这个记录器将负责控制日志信息。

public static Logger getLogger( String name)
登入後複製

通过指定的名字获得记录器,如果必要的话,则为这个名字创建一个新的记录器。name一般取本类的名字,比如:

static Logger logger = Logger.getLogger ( ServerWithLog4j.class.getName () )
登入後複製

4.2.读取配置文件
当获得了日志记录器之后,第二步将配置Log4j环境,其语法为:

若将log4j.properties放在工程根目录下也可不写此句,程序会自动找到配置文件。
BasicConfigurator.configure (): 自动快速地使用缺省Log4j环境。PropertyConfigurator.configure ( String configFilename) :读取使用Java的特性文件编写的配置文件。
DOMConfigurator.configure ( String filename ):读取XML形式的配置文件。

log4j使用以上3种配置器来初始化,使用PropertyConfigurator适用于所有的系统。如下的语句。

PropertyConfigurator.configure("log4j.properties");
登入後複製

对于一般的java project可以不使用上面的语句初始化log4j,log4j会自动在classpath下,找到配置文件并初始化。如果log4j不能自动初始化配置文件,那么就需要用上面的方法进行初始化。

注意:初始化配置文件,最好只在系统启动的时候执行一次,如果执行多次,一是浪费资源,二就是对于老版本的log4j,使用DailyRollingFileAppender时,可能会出现问题。


4.3.插入记录信息(格式化日志信息)
当上两个必要步骤执行完毕,您就可以轻松地使用不同优先级别的日志记录语句插入到您想记录日志的任何地方,其语法如下:

Logger.debug ( Object message ) ;
登入後複製

更多Java日誌軟體Log4j的基本使用教學課程相关文章请关注PHP中文网!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

<🎜>:泡泡膠模擬器無窮大 - 如何獲取和使用皇家鑰匙
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
北端:融合系統,解釋
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
Mandragora:巫婆樹的耳語 - 如何解鎖抓鉤
3 週前 By 尊渡假赌尊渡假赌尊渡假赌

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

熱門話題

Java教學
1666
14
CakePHP 教程
1425
52
Laravel 教程
1325
25
PHP教程
1272
29
C# 教程
1252
24
公司安全軟件導致應用無法運行?如何排查和解決? 公司安全軟件導致應用無法運行?如何排查和解決? Apr 19, 2025 pm 04:51 PM

公司安全軟件導致部分應用無法正常運行的排查與解決方法許多公司為了保障內部網絡安全,會部署安全軟件。 ...

如何將姓名轉換為數字以實現排序並保持群組中的一致性? 如何將姓名轉換為數字以實現排序並保持群組中的一致性? Apr 19, 2025 pm 11:30 PM

將姓名轉換為數字以實現排序的解決方案在許多應用場景中,用戶可能需要在群組中進行排序,尤其是在一個用...

如何使用MapStruct簡化系統對接中的字段映射問題? 如何使用MapStruct簡化系統對接中的字段映射問題? Apr 19, 2025 pm 06:21 PM

系統對接中的字段映射處理在進行系統對接時,常常會遇到一個棘手的問題:如何將A系統的接口字段有效地映�...

IntelliJ IDEA是如何在不輸出日誌的情況下識別Spring Boot項目的端口號的? IntelliJ IDEA是如何在不輸出日誌的情況下識別Spring Boot項目的端口號的? Apr 19, 2025 pm 11:45 PM

在使用IntelliJIDEAUltimate版本啟動Spring...

如何優雅地獲取實體類變量名構建數據庫查詢條件? 如何優雅地獲取實體類變量名構建數據庫查詢條件? Apr 19, 2025 pm 11:42 PM

在使用MyBatis-Plus或其他ORM框架進行數據庫操作時,經常需要根據實體類的屬性名構造查詢條件。如果每次都手動...

Java對像如何安全地轉換為數組? Java對像如何安全地轉換為數組? Apr 19, 2025 pm 11:33 PM

Java對象與數組的轉換:深入探討強制類型轉換的風險與正確方法很多Java初學者會遇到將一個對象轉換成數組的�...

如何利用Redis緩存方案高效實現產品排行榜列表的需求? 如何利用Redis緩存方案高效實現產品排行榜列表的需求? Apr 19, 2025 pm 11:36 PM

Redis緩存方案如何實現產品排行榜列表的需求?在開發過程中,我們常常需要處理排行榜的需求,例如展示一個�...

電商平台SKU和SPU數據庫設計:如何兼顧用戶自定義屬性和無屬性商品? 電商平台SKU和SPU數據庫設計:如何兼顧用戶自定義屬性和無屬性商品? Apr 19, 2025 pm 11:27 PM

電商平台SKU和SPU表設計詳解本文將探討電商平台中SKU和SPU的數據庫設計問題,特別是如何處理用戶自定義銷售屬...

See all articles