Home | History | Annotate | Download | only in pages
      1 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
      2   "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
      3 
      4 <html xmlns="http://www.w3.org/1999/xhtml">
      5   <head>
      6     <meta http-equiv="content-type" content="text/html; charset=iso-8859-1" />
      7     <title>SLF4J Migrator</title>
      8     <link rel="stylesheet" type="text/css" media="screen" href="css/site.css" />
      9   </head>
     10   <body>
     11     <script type="text/javascript">prefix='';</script>
     12     
     13     <script src="templates/header.js" type="text/javascript"></script>
     14     <div id="left">
     15       <script src="templates/left.js" type="text/javascript"></script>
     16     </div>
     17     <div id="content">
     18 
     19 
     20     <h1>SLF4J Migrator</h1>
     21     
     22     <p>The SLF4J migrator is a small Java tool for migrating Java source
     23     files from the Jakarta Commons Logging (JCL) API to SLF4J. It can
     24     also migrate from the log4j API to SLF4J, or from
     25     <code>java.util.logging</code> API to SLF4J.
     26     </p>
     27     
     28     <p>The SLF4J migrator consists of a single jar file that can be
     29     launched as a stand-alone java application. Here is the command:
     30     </p>
     31     
     32     <p class="source">java -jar slf4j-migrator-${version}.jar </p>
     33     
     34     <br/>
     35     
     36     <p>Once the application is launched, a window similar to the
     37     following should appear.
     38     </p>
     39     
     40     <p><img src="images/slf4j-migrator.gif" alt="slf4j-migrator.gif"/></p>
     41     
     42     <p>Use of the application should be self-explanatory. Please note that
     43     this migration tool does in-place replacement of Java files, meaning
     44     that there will be no back-up copies of modified files. <b>It is
     45     your responsibility to backup your files before using SLF4J
     46     Migrator.</b>
     47     </p>
     48     
     49     
     50     <h2>Limitations</h2>
     51     
     52     <p>SLF4J migrator is intended as a simple tool to help you to
     53     migrate your project source using JCL, log4j or JUL to SLF4J. It can
     54     only perform elementary conversion steps. Essentially, it will
     55     replace appropriate import lines and logger declarations.
     56     </p>
     57     
     58     <p>MyClass is a sample class using JCL. Here it is before:</p>
     59     
     60     <p class="source">package some.package;
     61       
     62 <b>import org.apache.commons.logging.Log;
     63 import org.apache.commons.logging.LogFactory;</b>
     64       
     65 public MyClass {    
     66             
     67   <b>Log logger = LogFactory.getLog(MyClass.class);</b>
     68       
     69   public void someMethod() { 
     70     logger.info("Hello world");
     71   }
     72 }</p>
     73 
     74   <p>and after migration:</p>
     75 
     76   <p class="source">package some.package;
     77 
     78 <b>import org.slf4j.Logger;
     79 import org.slf4j.LoggerFactory;</b>
     80 
     81 public MyClass {    
     82 
     83   <b>Logger logger = LoggerFactory.getLogger(MyClass.class);</b>
     84 
     85   public void someMethod() { 
     86     logger.info("Hello world");
     87   }
     88 }</p>
     89 
     90   <br/>
     91 
     92   <p>Although its conversion rules are elementary, the SLF4J migrator
     93   can still alleviate much of the grunt-work involved in migrating a
     94   Java project from JCL to SLF4J.
     95   </p>
     96 
     97   <p>Migration rules from log4j to SLF4J, or from JUL to SLF4J are
     98   similar.</p>
     99 
    100   <h3>General limitations</h3>
    101 
    102   <ul>
    103 
    104     <li>Build scripts are not modified
    105     
    106     <p>Your Ant/Maven/Ivy build scripts need to be modified manually to
    107     use SLF4J instead of JCL or log4j.</p>
    108 
    109     <p></p>
    110     </li>
    111 
    112     <li>only messages of type String are supported
    113 
    114     <p>If one of your log statements contains a non-string object as
    115     its sole parameter, you will have to manually add a toString()
    116     method call on the object. 
    117     </p>
    118 
    119     <p>For example,</p>
    120     <p class="source">logger.debug(new Object()); </p>
    121     <p>has to be manually re-written as</p>
    122     <p class="source">logger.debug(new Object().toString()); </p>
    123 
    124     <p></p>
    125     </li>
    126 
    127     <li>the FATAL level is not supported. 
    128     
    129     <p>You have to convert them manually. This limitation is not
    130     deemed very serious because there are usually very few log
    131     statements bearing the FATAL level.
    132     </p>
    133 
    134     <p>
    135     </p>
    136     </li>
    137 
    138     <li>if a method declares multiple loggers on the same line, the
    139     conversion will not be complete. Example:
    140     
    141     <p class="source">  public void someMethod(Log l1, Log l2) {
    142    ...
    143   }
    144 
    145 will be converted as 
    146 
    147   public void someMethod(Log l1, Logger l2) {
    148    ...
    149   } </p>
    150   </li>
    151   </ul>
    152 
    153   <h3>Limitations when migrating from log4j</h3>
    154 
    155   <ul>
    156     <li>NDC statements are left as-is
    157 
    158     <p>Since NDC is not supported by SLF4J, the migrator cannot
    159     properly handle NDC statements. You have to migrate them to MDC
    160     manually. Again, this limitation is not deemed serious because
    161     there are usually very few NDC statements even in large projects.
    162     </p>
    163 
    164     <p>Please note that contrary to NDC, MDC statements are migrated
    165     correctly because SLF4J supports such statements.</p>
    166 
    167     <p></p>
    168     </li>
    169 
    170     <li>Calls to <code>PropertyConfigurator</code> or
    171     <code>DomConfigurator</code> cannot be migrated since they have no
    172     SLF4J equivalents.
    173 
    174     <p>
    175     </p>
    176 
    177     </li> 
    178   </ul>
    179 
    180   <h3>Limitations when migrating from JUL</h3>
    181 
    182   
    183   <ul>
    184     <li>Calls to <code>finest()</code>, <code>finer()</code> or
    185     <code>finest()</code> methods of
    186     <code>java.util.logging.Logger</code> are left as is.
    187 
    188     <p>Given that <code>finest()</code>, <code>finer()</code> or
    189     <code>finest()</code> calls could map to both trace() or debug()
    190     calls in SLF4J, it is impossible to guess how the user wants to
    191     map these calls.
    192     </p>
    193 
    194     <p>
    195     </p>
    196 
    197     </li>
    198 
    199 
    200     <li>All strings matching ".severe(" are replaced by the string
    201     ".error(" without any contextual analysis. Similarly, all strings
    202     matching ".warning(" are replaced by ".warn(".
    203 
    204     <p>Since the match/replace operation is not contextual, if your
    205     code contains methods named "severe" or "warning", then the
    206     migration results will have compilation errors. Fortunately, such
    207     errors should be rare and easy to identify.
    208     </p>
    209 
    210     <p>
    211     </p>
    212 
    213     </li>
    214 
    215     <li>Invocations of the following methods defined in the
    216     <code>java.util.logging.Logger</code> class need to be migrated
    217     manually: <code>log</code>, <code>logp</code>, <code>logrb</code>,
    218     <code>entering</code>, <code>exiting</code>.
    219       
    220     </li>
    221   </ul>
    222 
    223   <script  src="templates/footer.js" type="text/javascript"></script> 
    224  </div> 
    225 </body>
    226 </html>
    227