Vra

Is dit moontlik om die stelsel omgewing veranderlikes verwys (in teenstelling met Java stelsel eienskappe) in 'n log4j xml konfigurasielêer?

Ek wil graag in staat wees om so iets te doen:

<level value="${env.LOG_LEVEL}" />

en het dit te kry wat uit die stelsel omgewing veranderlikes, so ek kan verhoed dat gebeur in so baie dinge met -D parameters.

Was dit nuttig?

Oplossing

Dit sintaksis gedokumenteer net in log4j 2.X so maak seker jy is met behulp van die korrekte weergawe. Dit werk nie op die 1.X weergawes.

    <Appenders>
    <File name="file" fileName="${env:LOG_PATH}">
        <PatternLayout>
            <Pattern>%d %p %c{1.} [%t] %m %ex%n</Pattern>
        </PatternLayout>
    </File>
</Appenders>

Ander wenke

Ek het probeer om onlangs te doen wat en kon nie kry om dit te werk. Wat ek beland doen is stuur 'n veranderlike by die begin. So sê jy het 'n omgewing veranderlike genoem $ LOG_LEVEL:

<level value="${log_level}" />

en by die begin ...

java -Dlog_level=$LOG_LEVEL your_app

Ek dink dit word nie ondersteun nie, maar basies kan jy twee dinge in jou omgewing veranderlikes te bring nie:

  1. Gebruik System.setProperty voor Log4J kry ingestel

  2. Skakel (jou) omgewing veranderlikes aan die stelsel eienskappe in jou lanseerder

Die eerste opsie kook basies neer op hierdie:

for (Map<String,String>.Entry entry : System.getenv().entrySet()) {
  System.setProperty(entry.getKey(), entry.getValue());
}

... maar die vraag is natuurlik waar om hierdie kode te sit. In die besonder as jy binne 'n soort van Tomcat houer of 'n soortgelyke hardloop is, dit kan wees problematies.

Die ander groot mate afhanklik van jou omgewing. Basies as jy 'n dop script wat jou app begin, kan jy 'n paar dop magic aan alle omgewing veranderlikes as eienskappe, of net die mense wat jy nodig het, Bv stel skryf:.

java -DMY_ENV=$MY_ENV -DMY_OTHER_ENV=$MY_OTHER_ENV -cp ... com.example.Main

Dit is ook moontlik om jou bediener begin skrifte verander om dit te ondersteun, bv catalina.sh of soortgelyke.

Jy moet 'n kolon tussen ENV en die naam van die veranderlike sit, soos volg:

<level value="${env:LOG_LEVEL}" />

Skep 'n stelsel veranderlike. Ek verkies om setenv.bat gebruik vir sulke veranderlikes.

@echo off
rem app specific log dir
set "APP_LOG_ROOTDIR=../app/app-log"
exit /b 0

verwysing in log4j.xml lêer Voeg

<appender name="fileAppender" class="org.apache.log4j.RollingFileAppender">
  <param name="Threshold" value="DEBUG" />
  <param name="MaxFileSize" value="512KB" />
  <param name="MaxBackupIndex" value="10" />
  <param name="File" value="${APP_LOG_ROOTDIR}/app.log"/>
  <layout class="org.apache.log4j.PatternLayout">
   <param name="ConversionPattern" value="%d %-5p %c{1} %m %n" />
  </layout>
</appender>
Gelisensieer onder: CC-BY-SA met toeskrywing
Nie verbonde aan StackOverflow
scroll top