Child pages
  • log4j rootLogger több fájlba?
Skip to end of metadata
Go to start of metadata
Irsz esetleg egy sajat appendert?
      
      
Page viewed times
#trackbackRdf ($trackbackUtils.getContentIdentifier($page) $page.title $trackbackUtils.getPingUrl($page))
  • No labels

13 Comments

  1. Próbálgatom a log4j keretrendszert, XML-ben tárolom a loggolási információkat...

    Kérdésem az lenne, hogy lehet-e olyat, hogy a root logger több fájlba (appender-be) loggol, mégpedig level szerint szétválasztva?

      <root>
        <priority value ="info" />
        <appender-ref ref="log-info"/>
      </root>

    A DTD szerint egy root lehet és abban egy priority... van valami kerülő út?
  2. Jah, van a ${tomcathome}/common/classes alatt egy log4j.xml leíró:

    <?xml version="1.0" encoding="UTF-8" ?>
    <!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">

    <log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/">
      <appender name="ConsoleAppender" class="org.apache.log4j.ConsoleAppender">
        <layout class="org.apache.log4j.SimpleLayout"/>
      </appender>
      <root>
        <priority value ="info" />
        <appender-ref ref="ConsoleAppender"/>
      </root>
    </log4j:configuration>

    Ezt használja is, mert a log4j nélkül ezt írta:

    2007.01.24. 17:36:45 org.apache.catalina.startup.HostConfig checkResources
    INFO: Reloading context [/JavaForum]
    2007.01.24. 17:36:50 org.apache.catalina.core.ApplicationContext log
    INFO: Manager: restart: Reloading web application at '/JavaForum'
    2007.01.24. 17:36:50 org.apache.catalina.core.StandardContext reload
    INFO: Reloading this Context has started

    Most ezt írja (tehát SimpleLayout):

    INFO - Manager: init: Associated with Deployer 'Catalina:type=Deployer,host=localhost'
    INFO - Manager: init: Global resources are available
    INFO - Manager: restart: Reloading web application at '/JavaForum'
    INFO - Reloading this Context has started

    A JavaForum kontext classes alatti XML ilyen:

      <root>
        <priority value ="debug" />
        <appender-ref ref="debug"/>
        <appender-ref ref="warn"/>
        <appender-ref ref="error"/>
      </root>

    És a debug appender állománya tele van ilyesmivel:

    2007-01-24 18:29:54,542 org.apache.tomcat.util.digester.Digester startDocument()
    2007-01-24 18:29:54,543 org.apache.tomcat.util.digester.Digester startElement(,,web-app)
    2007-01-24 18:29:54,543 org.apache.tomcat.util.digester.Digester   Pushing body text ''
    2007-01-24 18:29:54,544 org.apache.tomcat.util.digester.Digester   New match='web-app'
    2007-01-24 18:29:54,545 org.apache.tomcat.util.digester.Digester   Fire begin() for org.apache.catalina.startup.SetPublicIdRule@3a5794
    2007-01-24 18:29:54,545 org.apache.catalina.startup.SetPublicIdRule org.apache.catalina.core.StandardContext.setPublicId(null)

    Debug alatt én a saját debug naplómat szeretném látni... van rá mód? :)
  3. A log4j-nek még van egy olyan koncepciója -amiről érdemes tudni- hogy a loggereket hierarchiába sorolja. A root logger mindenkinek az "őse". Nem igazán javallott használni, inkább saját loggereket érdemes létrehozni. Egyet mindenképp alkalmazásonként, de lehet többet is. Ha több loggert hozol létre, akkor több lehetőséged van a loggolás hangolására. Ha java class-ra kérsz el loggert, a hierarchia azonos a package-vel. Ha név szerint kérsz el loggert, akkor a pötty jelzi a leszármazást.
    Pl:

    package x.y.z;
    class MyClass {
    private static final Logger logger = Logger.getLogger(MyClass.class);
    vagy:
    private static final Logger logger = Logger.getLogger("myapp.moduleX.logger1");
    }

    Ezután a config fájlban lehet hangolni a különböző loggerek vagy hierarchiák loggolási szintjét. Pl:

    <category name="org">
         <priority value="INFO"/>
       </category>

       <category name="tomcat">
         <priority value="INFO"/>
       </category>

    Ezután jön a <root> szekció.

    Ez egy tipikus példa JBoss-ban a szerver és egyéb "org" komponensek elhallgattatására, mert azok is folyton belepampognak a logba. Szerintem bővebb magyarázat nélkül is érthető.
  4. Ez nem jó?
     
    <appender name="warn-app" class="org.apache.log4j.DailyRollingFileAppender">
        <param name="File" value="${user.home}/logs/log.warn"/>
        <param name="Threshold" value="WARN" />
        <param name="Append" value="true"/>
        <param name="datePattern" value="'.'yyyy-MM-dd" />
        <layout class="org.apache.log4j.PatternLayout">
          <param name="ConversionPattern" value="%d %C{2} %m\n"/>
        </layout>
      </appender>

      <appender name="error-app" class="org.apache.log4j.DailyRollingFileAppender">
        <param name="File" value="${user.home}/logs/log.error"/>
        <param name="Threshold" value="ERROR" />
        <param name="Append" value="true"/>
        <param name="datePattern" value="'.'yyyy-MM-dd" />
        <layout class="org.apache.log4j.PatternLayout">
          <param name="ConversionPattern" value="%d %C{2} %m\n"/>
        </layout>
      </appender>

    ...

      <root>
        <appender-ref ref="warn-app"/>
        <appender-ref ref="error-app"/>
      </root>
  5. Viszont nem biztos hogy teljesen praktikus a megoldas, az odaig oke hogy a magasabb prioritasu hibak elsobbsegi kiszolgalast kapnak, csak kicsit nehezebb lesz osszefesulnod a fileokat amikor kell. Akkor mar inkab egy logszuro, valahol volt egy ilyen is.

    Megvan egyben is... mégpedig a debug.log fájlban, aztán a warn.log fájlban a WARN és afeletti, az error.log fájlban ERROR és afeletti. Azért jó ez, az error.log mellé van egy SMTPAppender is, ami ezeket levélben is elküldi, csak nem akartam erre külön nevesített logger példányt kérni minden osztályban, a getRootLogger() elégnek tűnt... :)

    Kissé hülye vagyok még a logj4-hez, ma használom először... :)

    Hogy szokás ezt egyébként az osztályokban megoldani? Mert most minden osztály végére szórok egy

    private static org.apache.log4j.Logger logger=org.apache.log4j.Logger.getRootLogger();

    sort, és a logger példányt használom loggolásra. Jó ez így?

    tvik: Ez nem jó?

    Ez jónak néz ki, legalábbis kiindulásnak jó... még finomítom... de nagyon köszönöm! :)
  6. Hát alulról tudod korlátozni az appendereket a threshold megadásával. Pl
    <param name="Threshold" value="WARN"/> csak a WARN és afölötti fontosságúakat loggolja.
    De olyanról nem tudok hogy felülről lehetne korlátozni az appendert és szerintem nincs is sok értelme. Ami engem illet igencsak morcos lennék ha különböző fájlokból kellene összeszednem a debug, info, warn, error logokat. Rendszerint ezek nagyon keverednek és egymás nélkül nem értelmezhetőek. Én legalábbis így használom.
  7. Alulról persze, hogy megy... de én nem azt szeretném... :)

    Gyakorlatilag azt szeretném, hogy legyen egy nagy log, amibe minden belemegy (debugtól felfelé) és legyen még kettő kategória (például log.warn, log.error), amelyekbe így szűkül a beletett adat (log.error tartalma ERROR és FATAL). Mindegy, hogy kinek mennyire tetszik, nekem ez kellene... :D

    Úgy látszik nincs erre official megoldás, azért gondoltam, hogy van, mert a UNIX-ok syslogng programja tud ilyen szűrést, de gyanús volt, hogy sehol nem látok ilyen példát... :)

    Irsz esetleg egy sajat appendert?

    Ez is lehetőség, de ennyire nem égető, megoldom egy debug root és kettő másik nevesített loggerrel. :)
  8. Node a Threshold pont ezt csinálja amit írsz. :)
  9. No, hogy tiszta legyen... itt a most használt log4j.xml részlete:

      <appender name="debug-app" class="org.apache.log4j.DailyRollingFileAppender">
        <param name="File" value="${user.home}/logs/log.debug"/>
        <param name="Append" value="true"/>
        <param name="datePattern" value="'.'yyyy-MM-dd" />
        <layout class="org.apache.log4j.PatternLayout">
          <param name="ConversionPattern" value="%d %C %m\n"/>
        </layout>
      </appender>

      <appender name="warn-app" class="org.apache.log4j.DailyRollingFileAppender">
        <param name="File" value="${user.home}/logs/log.warn"/>
        <param name="Append" value="true"/>
        <param name="datePattern" value="'.'yyyy-MM-dd" />
        <layout class="org.apache.log4j.PatternLayout">
          <param name="ConversionPattern" value="%d %C{2} %m\n"/>
        </layout>
      </appender>

      <appender name="error-app" class="org.apache.log4j.DailyRollingFileAppender">
        <param name="File" value="${user.home}/logs/log.error"/>
        <param name="Append" value="true"/>
        <param name="datePattern" value="'.'yyyy-MM-dd" />
        <layout class="org.apache.log4j.PatternLayout">
          <param name="ConversionPattern" value="%d %l\n%-10p %m\n"/>
        </layout>
      </appender>

      <logger name="log-warn">
        <level value="warn"/>
        <appender-ref ref="warn-app"/>
      </logger>

      <logger name="log-error">
        <level value="error"/>
        <appender-ref ref="error-app"/>
      </logger>
     
      <root>
        <priority value ="debug" />
        <appender-ref ref="debug-app"/>
      </root>

    Én ilyesmit szeretnék:

      <root>
        <priority value ="debug" />
        <appender-ref ref="debug-app"/>
        <level value="warn"/>
        <appender-ref ref="warn-app"/>
        <level value="error"/>
        <appender-ref ref="error-app"/>
      </root>

    Hogy ne kelljen elkérnem a loggoláshoz a nevesített loggereket.
  10. Gabor: zmb-hez csatlakozva szerintem egy uj appenderrel perc alatt megoldod a problemat. Viszont nem biztos hogy teljesen praktikus a megoldas, az odaig oke hogy a magasabb prioritasu hibak elsobbsegi kiszolgalast kapnak, csak kicsit nehezebb lesz osszefesulnod a fileokat amikor kell. Akkor mar inkab egy logszuro, valahol volt egy ilyen is.
  11. No, már csak az a bajom, hogy ha debug levelem van, akkor a Tomcat a saját debug üzeneteivel beleszór kérésenként kb. 700kBájtnyi adatot... erről hogy lehetne lebeszélni? :)
  12. Hmmm... így újra elolvasva szerintem nem egyértelmű... :)

    Azt szeretném, hogy ha a programban elkérem a rootLogger példányt:

    logger=org.apache.log4j.Logger.getRootLogger();

    akkor a különféle szintű bejegyzések (.info, .warn, .fatal, stb) különféle fájlokba kerüljenek (log.debug, log.info, log.fatal, stb).

    Azt szeretném elkerülni, hogy csináljak 6-7 féle appendert a megfelelő fájlnevekkel, és 6-7 féle logger bejegyzést.
  13. log4j kérdés: Van olyan konfig lehetőség, hogy egy adott loggernek egy adott appenderre megmondhassam a severity level-t?