1. 程式人生 > >Log4j不同級別輸出到不同檔案的幾種方式

Log4j不同級別輸出到不同檔案的幾種方式

log4j已經是古董了,但是現在專案還在用,需要用到不同級別輸出到不同檔案,所以把幾種實現方式記錄下來,備忘!
下面的幾種配置都是使用properties的情況,但是xml的原理也一樣.

  1. 使用LevelRangeFilter
  2. 使用LevelMatchFilter
  3. 自定義Appender

    最後再貼出下面一種需求的配置檔案

    1. 專案info和error級別日誌分開記錄為 allInfo,allError檔案
    2. 其中A模組的日誌單獨記錄為afile
    3. 其中A模組的info級別日誌只在afile記錄,不在allinfo記錄(info只記錄一次)
    4. 其中A模組的error級別日誌在afile,allError中都記錄

    下面詳細說明:

1.使用LevelRangeFilter
這個應該是3種裡面最方便的,配置如下
log4j.appender.InfoFile = org.apache.log4j.RollingFileAppender
log4j.appender.InfoFile.File = logs/info1.log
log4j.appender.InfoFile.MaxFileSize = 10MB
log4j.appender.InfoFile.Threshold = INFO
log4j.appender.InfoFile.layout = org.apache.log4j.PatternLayout
log4j.appender.InfoFile.layout.ConversionPattern =[%p] [%d{yyyy-MM-dd HH\:mm\:ss}][%c]%m%n log4j.appender.InfoFile.filter.F1=org.apache.log4j.varia.LevelRangeFilter log4j.appender.InfoFile.filter.F1.LevelMin=INFO log4j.appender.InfoFile.filter.F1.LevelMax=INFO

這裡通過Threshold指定輸出級別為INFO,但是預設的大於INFO的也會輸出.
下面增加的filter指定了最大級別和最小級別,都為INFO,所以最終只會輸出INFO級別.

2.使用LevelMatchFilter
這個配置就稍微多點了,例如,我們輸出INFO級別的,需要下面配置
log4j.appender.InfoFile2 = org.apache.log4j.RollingFileAppender
log4j.appender.InfoFile2.File = logs/info2.log
log4j.appender.InfoFile2.MaxFileSize = 10MB
log4j.appender.InfoFile2.Threshold = INFO
log4j.appender.InfoFile2.layout = org.apache.log4j.PatternLayout
log4j.appender.InfoFile2.layout.ConversionPattern =[%p] [%d{yyyy-MM-dd HH\:mm\:ss}][%c]%m%n
log4j.appender.InfoFile2.filter.F1=org.apache.log4j.varia.LevelMatchFilter
log4j.appender.InfoFile2.filter.F1.levelToMatch=INFO
log4j.appender.InfoFile2.filter.F1.AcceptOnMatch=true 
log4j.appender.InfoFile2.filter.F2=org.apache.log4j.varia.LevelMatchFilter
log4j.appender.InfoFile2.filter.F2.levelToMatch=ERROR
log4j.appender.InfoFile2.filter.F2.AcceptOnMatch=false
log4j.appender.InfoFile2.filter.F3=org.apache.log4j.varia.LevelMatchFilter
log4j.appender.InfoFile2.filter.F3.levelToMatch=WARN
log4j.appender.InfoFile2.filter.F3.AcceptOnMatch=false  
log4j.appender.InfoFile2.filter.F4=org.apache.log4j.varia.LevelMatchFilter
log4j.appender.InfoFile2.filter.F4.levelToMatch=DEBUG
log4j.appender.InfoFile2.filter.F4.AcceptOnMatch=false  

這裡要注意的就是指定匹配級別INFO為true後,還需要把其他級別都設定為false,否則其他級別還是會輸出(包括低於Threshold指定的級別).

3.自定義Appender
一種常見的配置檔案如下
log4j.rootLogger=INFO,InfoFile3,errorFile3

log4j.appender.InfoFile3 = org.apache.log4j.RollingFileAppender
log4j.appender.InfoFile3.File = logs/info3.log
log4j.appender.InfoFile3.MaxFileSize = 10MB
log4j.appender.InfoFile3.Threshold = INFO
log4j.appender.InfoFile3.layout = org.apache.log4j.PatternLayout
log4j.appender.InfoFile3.layout.ConversionPattern =[%p] [%d{yyyy-MM-dd HH\:mm\:ss}][%c]%m%n

log4j.appender.errorFile3 = org.apache.log4j.RollingFileAppender
log4j.appender.errorFile3.File = logs/error3.log
log4j.appender.errorFile3.MaxFileSize = 10MB
log4j.appender.errorFile3.Threshold = ERROR
log4j.appender.errorFile3.layout = org.apache.log4j.PatternLayout
log4j.appender.errorFile3.layout.ConversionPattern =[%p] [%d{yyyy-MM-dd HH\:mm\:ss}][%c]%m%n

這裡我們通過Threshold已經指定了級別,但是由於預設的實現會輸出大於等於指定級別的,所以我們可以修改下這個預設實現.

package com.dingcheng.log;

import org.apache.log4j.Priority;
import org.apache.log4j.RollingFileAppender;

public class MyRollingFileAppender extends RollingFileAppender {  
     @Override  
     public boolean isAsSevereAsThreshold(Priority priority) {  
         return this.getThreshold().equals(priority);  
     }  
}

然後配置檔案中使用自定義的類

log4j.rootLogger=INFO,InfoFile3,errorFile3

log4j.appender.InfoFile3 = com.dingcheng.log.MyRollingFileAppender
log4j.appender.InfoFile3.File = logs/info3.log
log4j.appender.InfoFile3.MaxFileSize = 10MB
log4j.appender.InfoFile3.Threshold = INFO
log4j.appender.InfoFile3.layout = org.apache.log4j.PatternLayout
log4j.appender.InfoFile3.layout.ConversionPattern =[%p] [%d{yyyy-MM-dd HH\:mm\:ss}][%c]%m%n

log4j.appender.errorFile3 = com.dingcheng.log.MyRollingFileAppender
log4j.appender.errorFile3.File = logs/error3.log
log4j.appender.errorFile3.MaxFileSize = 10MB
log4j.appender.errorFile3.Threshold = ERROR
log4j.appender.errorFile3.layout = org.apache.log4j.PatternLayout
log4j.appender.errorFile3.layout.ConversionPattern =[%p] [%d{yyyy-MM-dd HH\:mm\:ss}][%c]%m%n

這樣就可以了.

當然除了上面的3種方法,還有自定義一個類,裡面不同級別指向不同的檔案

public class LogUtil{
    public static void error(String msg) {
        Logger.getLogger("error").error(msg);
    }
}

方法很多,找個最簡單的就可以了.

最後再貼出下面一種需求的配置檔案
1. 專案info和error級別日誌分開記錄為 allInfo,allError檔案
2. 其中A模組的日誌單獨記錄為afile
3. 其中A模組的info級別日誌只在afile記錄,不在allinfo記錄(info只記錄一次)
4. 其中A模組的error級別日誌在afile,allError中都記錄

#根設定,輸出級別為info級別, 輸出檔案為 allInfo,allError
log4j.rootLogger=INFO,allInfo,allError  

#定義allInfo的詳細配置,只記錄info級別
log4j.appender.allInfo = org.apache.log4j.RollingFileAppender
log4j.appender.allInfo.File = /logs/allInfo.log
log4j.appender.allInfo.MaxFileSize = 50MB
log4j.appender.allInfo.Threshold = INFO
log4j.appender.allInfo.layout = org.apache.log4j.PatternLayout
log4j.appender.allInfo.layout.ConversionPattern =[%p] %-d{yyyy-MM-dd HH:mm:ss} [%t] [%l]--> %m %x %n
log4j.appender.allInfo.filter.F1=org.apache.log4j.varia.LevelRangeFilter
log4j.appender.allInfo.filter.F1.LevelMin=INFO
log4j.appender.allInfo.filter.F1.LevelMax=INFO

#定義allError的詳細配置,只記錄error級別
log4j.appender.allError = org.apache.log4j.RollingFileAppender
log4j.appender.allError.File = /data/wuliu-provider/logs/order-error.log
log4j.appender.allError.MaxFileSize = 50MB
log4j.appender.allError.Threshold = ERROR
log4j.appender.allError.layout = org.apache.log4j.PatternLayout
log4j.appender.allError.layout.ConversionPattern=[%p] %-d{yyyy-MM-dd HH:mm:ss} [%t] [%l]--> %m %x %n

#A模組單獨配置,輸出級別為INFO,輸出檔案為 afile,allError ; additivity=false指定不繼承根設定
log4j.logger.AMODULE=INFO,afile,allError
log4j.additivity.AMODULE = false
log4j.appender.afile = org.apache.log4j.RollingFileAppender
log4j.appender.afile.File = /data/wuliu-provider/logs/YuanCheng.log
log4j.appender.afile.MaxFileSize = 50MB
log4j.appender.afile.Threshold = INFO
log4j.appender.afile.layout = org.apache.log4j.PatternLayout
log4j.appender.afile.layout.ConversionPattern =[%p] %d{yyyy-MM-dd HH\:mm\:ss} [%c]%m%n

在程式碼中使用A模組的單獨輸出,則

private static Logger logger = Logger.getLogger("AMODULE");//指定配置檔案中的名稱

相關推薦

JavaScript 輸出訊息的方式

轉載:https://blog.csdn.net/cym_bj/article/details/55096151   1,window.alert() 在頁面彈出一個對話方塊。早期js除錯使用。(其中window可以省略) 2、confirm()在頁面彈出一個對話方塊。多一個取

輸入輸出流的方式

一些自己對io流的錯誤嘗試 import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.FileInputStream; import java.io.FileOutputStream; impo

Asp.net下載檔案方式

protected void Button1_Click(object sender, EventArgs e) { /* 微軟為Response物件提供了一個新的方法TransmitFile來解決使用Response.BinaryWrite 下載超過400mb的檔案時導致Aspnet_wp.

asp.net 下載檔案方式

protected void Button1_Click(object sender, EventArgs e)   {   /*   微軟為Response物件提供了一個新的方法TransmitFile來解決使用Response.BinaryWrite   下載超過400mb的檔案時導

java讀取寫入檔案方式效率比較

public class ReadTxtJson {public static String readTxtFile(String FileName) throws Exception {BufferedInputStream bufferedInputStream = n

Log4j不同級別輸出不同檔案方式

log4j已經是古董了,但是現在專案還在用,需要用到不同級別輸出到不同檔案,所以把幾種實現方式記錄下來,備忘! 下面的幾種配置都是使用properties的情況,但是xml的原理也一樣. 使用LevelRangeFilter 使用LevelMatchFil

Log4j級別輸出日誌到不同文件配置

tails lin file true nds 配置文件 http strong 自定義 1、自定義LogFileAppender類,繼承DailyRollingFileAppender,實現Log4j按級別輸出日誌到不同文件。 package com.liying.

logback日誌輸出不同級別不同檔案(開發例項配置)

<?xml version="1.0" encoding="UTF-8"?> <configuration> <!-- 控制檯 appender --> <appender name="STDOUT" class="

不同頁面之間實現參數傳遞的方式

瀏覽器 行存儲 傳遞參數 如何 數據傳遞 序列 由於 文件中 request對象 由於web系統采用http協議在瀏覽器和服務器之間傳輸數據,而http協議是一種無狀態的協議,如何在不同頁面之間傳遞數據,可以有一下幾種方式: 方式一:表單方式傳遞表單傳遞參數是一種最簡單,也

js裡宣告函式有方式? var abc = function(x){} 和 function abc(x){} 這兩宣告方法有什麼不同?

先後者是指函式宣告,前者是指函式表示式,他們之間的區別是後者會在程式碼執行之前被JS直譯器載入到作用域中,這樣一來就可以在程式設計時在定義函式之前呼叫這個函式,此法是有效的;而前者則是在程式碼執行到那一行時候才會有定義,此外函式表示式是建立了一個匿名函式,然後將

關於在hadoop上job執行的方式(不同平臺)

mr job的幾種執行模式 1、在eclipse中開發好mr程式(windows或linux下都可以),然後打成jar包(wc.jar),上傳到伺服器 執行命令 hadoop jar wc.jar cn.itheima.hadoop.MainClassRunner 這種

【巨坑】springmvc 輸出json格式數據的方式

mapping cep process 添加 exc 文件中 != style find 最近公司項目需要發布一些數據服務,從設計到實現兩天就弄完了,心中竊喜之。 結果臨近部署時突然發現。。。。。 服務輸出的JSON 數據中 date 類型數據輸出格式要麽是時間戳,要麽

JS輸出訊息(alert)的方式

<script type="text/javascript"> //直接彈出,無取消按鈕 alert("alert"); //有取消按鈕 confirm("Confirm"); //彈出輸入框 prompt("prompt");

WPFの操作檔案瀏覽框方式

原文: WPFの操作檔案瀏覽框幾種方式 方式1: 使用win32控制元件OpenFileDialog Microsoft.Win32.OpenFileDialog ofd = new Microsoft.Win32.OpenFileDialog(); ofd.DefaultExt

JavaScript~檔案下載的方式

1.通過a標籤的方式來下載 <a href='' target='_blank'></a> 2.通過提交form表單的方式 var $form = $('<form action="'+url+'" 

C# 寫入檔案方式

1. FileStream.Write string filePath = Directory.GetCurrentDirectory() + "\\" + Process.GetCurrentProcess().ProcessName + ".txt"; if (File.Exist

Java讀取resource檔案/路徑的方式

方式一: String fileName = this.getClass().getClassLoader().getResource("檔名").getPath();//獲取檔案路徑 String fileUtl = this.getClass().getResource("檔名").getFi

bat批處理執行python 的方式 ———— 批處理, python打包成 exe檔案

第一種方式: @echo off C: cd C:\Users\ldl\Desktop start python test100.py start python 1.py start python 1.py 10 start python 1.py 100 exit 第二種方

Python讀取WAV檔案方式整理

1)scipy from scipy.io import wavfile import numpy as np sample_rate, sig = wavfile.read('new.wav') print("取樣率: %d" % sample_rate) print(sig)

Python檔案操作中的a,a+,w,w+方式的區別 ——轉載

轉載:https://blog.csdn.net/qq_38059635/article/details/81606977   第一步 排除檔案開啟方式錯誤: r只讀,r+讀寫,不建立 w新建只寫,w+新建讀寫,二者都會將檔案內容清零 (以w方式開啟,不能讀出。w+可讀