Pertanyaan Log4J2 - menetapkan nama file file appender pada saat runtime


Saya memiliki file konfigurasi log4j2.xml di jalur kelas. Salah satu appender adalah File appender, dan saya ingin mengatur nama file target pada waktu proses di aplikasi Java.

Menurut dokumen Saya seharusnya bisa menggunakan "$" ganda dan awalan konteks dalam file log4j2.xml:

<appenders>
    <File name="MyFile" fileName="$${sys:logFilename}">
        <PatternLayout pattern="%-4r %d{${datestamp}} [%t] %-5level %logger{36} - %msg%n"/>
    </File>
</appenders>

di mana awalan "sys" menunjukkan bahwa Configurator akan mencari properti "logFilename" di properti sistem. Jadi dalam aplikasi, saya menelepon (lebih awal):

System.setProperty("logFilename", filename);

Saya juga telah mengaktifkan auto-reconfiguration untuk log4j2 di file xml:

<configuration status="debug" monitorInterval="5">>

Sayangnya, ini tidak memiliki efek apa pun, dan file log tidak pernah dibuat. Beberapa output status log4j2 di bawah ini:

2013-02-13 15: 36: 37,574 DEBUG Memanggil createAppender di kelas org.apache.logging.log4j.core.appender.FileAppender untuk file elemen dengan params (fileName = "$ {sys: logFilename}", tambahkan = "null" , mengunci = "null", name = "MyFile", immediateFlush = "null", suppressExceptions = "null", bufferedIO = "null", PatternLayout (% - 4r% d {yyyy-MM-dd / HH: mm: ss .SSS / zzz} [% t]% -5level% logger {36} -% msg% n), null)

2013-02-13 15: 36: 37,576 DEBUG Mulai FileManager $ {sys: logFilename}

Bagaimana saya bisa memiliki nilai "fileName" di File Appender diatur pada waktu berjalan?  Atau, bagaimana saya bisa menambahkan File Appender baru ke root logger pada saat run time? Di Log4j 2.0 sebagian besar API untuk mengubah konfigurasi disembunyikan.


32
2018-02-13 20:45


asal


Jawaban:


h / t rgoers The FileAppender tidak mendukung dua tanda dolar pada nama file sebagai file dibuka ketika appender dimulai. Apa yang Anda tunjukkan dengan dua tanda dolar adalah yang Anda inginkan - berpotensi - nama file yang berbeda untuk setiap peristiwa.

Dengan satu $ (seperti dalam ${sys:logFilename}), sistem akan mencari properti "logFilename" di properti sistem.

Dengan demikian, log4j2.xml seharusnya memiliki:

<appenders>
    <File name="MyFile" fileName="${sys:logFilename}">
        <PatternLayout pattern="%-4r %d{${datestamp}} [%t] %-5level %logger{36} - %msg%n"/>
    </File>
</appenders>

Aplikasi Java harus mengatur properti sistem:

System.setProperty("logFilename", filename);

dan konfigurasi ulang logger:

org.apache.logging.log4j.core.LoggerContext ctx =
    (org.apache.logging.log4j.core.LoggerContext) LogManager.getContext(false);
ctx.reconfigure();

Ini menghasilkan perilaku yang diinginkan.


33
2018-02-14 15:01



Pada versi log4j2 2.5 di sini adalah cara paling sederhana untuk mencapai ini:

Di dalam Anda log4j2.xml:

<Appenders>
   <File name="MyFile" filename="${sys:logFilename}">
   ...

Dalam diri Anda utama MyApp.java mengajukan:

public class MyApp {

    Logger log;

    static {
          System.setProperty("logFilename", ...);
          log = LogManager.getLogger();
    }

    public static void main(String... args) {...}
}

MENANGKAP: Anda harus mengatur logFilename properti sistem sebelum log4j2 dimuat. Dalam contoh ini sebelum menelepon LogManager.getLogger.


7
2017-12-21 21:12



Saya tahu topik ini sudah tua, tetapi jawabannya tidak terlalu cocok untuk saya. Berikut ini adalah fungsi yang memungkinkan Anda untuk mengkonfigurasi ulang Append saat saat runtime:

static void updateLogger(String file_name, String appender_name, String package_name){
LoggerContext context = (LoggerContext) LogManager.getContext(false);
    Configuration configuration = context.getConfiguration();
    Layout<? extends Serializable> old_layout = configuration.getAppender(appender_name).getLayout();

    //delete old appender/logger
    configuration.getAppender(appender_name).stop();
    configuration.removeLogger(package_name);

    //create new appender/logger
    LoggerConfig loggerConfig = new LoggerConfig(package_name, Level.INFO, false);
    FileAppender appender = FileAppender.createAppender(file_name, "false", "false", appender_name, "true", "true", "true",
            "8192", old_layout, null, "false", "", configuration);
    appender.start();
    loggerConfig.addAppender(appender, Level.INFO, null);
    configuration.addLogger(package_name, loggerConfig);

    context.updateLoggers();
}

Anda dapat menentukan nama file, nama appender Anda dan nama paket yang ingin Anda log.

Contoh Logger:

<File name="fileWriter_api" fileName="${LOG_DIR}/api.log" append="false">
  <PatternLayout pattern="${PATTERN}"/>
</File>

Dapat ditata ulang seperti ini:

updateLogger("log/api_new.log", "fileWriter_api", "my.package");

6
2018-06-29 09:55