2010-08-23 20 views
0

Dans mon application j'utilise log4j et ai un my_system.log où tous les messages devraient être jetés. Le problème que j'ai est que lorsqu'une erreur se produit, elle apparaît également dans server.log (je ne veux pas que cela se produise).comment ne pas jeter des exceptions à server.log dans java

public String getAccessFlag (String userId, String participantCode, String roleId) { 
    HashMap parmMap = new HashMap(); 
    parmMap.put("userId", userId.toUpperCase()); 
    parmMap.put("roleId", roleId); 
    log.info(parmMap); 
    try { 
     getSqlMapClientOltp().queryForList("auth.getAccess", parmMap); 
    } catch (SQLException ex) { 
     log.error(ex, ex); 
     throw new RuntimeException (ex); 
    } 
    List result = (List)parmMap.get("Result0"); 
    return ((String)(((HashMap) result.get(0)).get("accessVoucher"))).trim(); 
} 

Comme vous pouvez le voir, je suis attrapant les exceptions parce que je veux le connecter my_system.log mais parce que je veux l'exécution d'arrêter (car l'erreur est survenue) je lance à nouveau l'erreur. Je crois parce que je le lance, il montre dans server.log.

Comment puis-je éviter cela?

MISE À JOUR:

Voici mes appenders:

<appender name="myAppender" class="org.apache.log4j.AsyncAppender"> 
    <appender-ref ref="myFile" /> 
</appender> 

<appender name="myFile" class="org.apache.log4j.DailyRollingFileAppender"> 
    <param name="File" value="../systems/my/log/my_system.log" /> 
    <param name="Append" value="true" /> 
    <param name="DatePattern" value="'.'yyyy-MM-dd" /> 
    <layout class="org.apache.log4j.PatternLayout"> 
    <param name="ConversionPattern" value="[%d{dd/MMM/yyyy:HH:mm:ss.SSS}]~[%-5p]~[%c:%M]~[%m]%n" /> 
    </layout> 
    <filter class="org.apache.log4j.varia.LevelRangeFilter"> 
     <param name="LevelMin" value="TRACE#com.org.common.logging.HUDLogLevel" /> 
     <param name="LevelMax" value="FATAL" /> 
    </filter> 
</appender> 
+0

Utilisez-vous JBoss? Si oui, quelle version de JBoss? –

+0

J'utilise GlassFish V3 –

+0

Pouvez-vous montrer vos appenders? Utilisez-vous le 'ConsoleAppender'? –

Répondre

1

Toutes les exceptions uncatched iront dans le journal du serveur. Si vous voulez quelque chose de ne pas aller là-bas, ne réessayez pas RuntimeException. Si vous voulez arrêter l'exécution de la méthode, il suffit de return de la méthode.

Si vous souhaitez également interrompre l'exécution dans la méthode de l'appelant, ne renvoyez pas une exception non contrôlée. Déclarer la méthode pour lancer l'exception vérifiée et l'attraper et l'enregistrer dans l'appelant.

Vous pouvez définir un gestionnaire d'exception personnalisée pour les exceptions non rattrapées:

Thread.currentThread().setUncaughtExceptionHandler(yourExceptionHandler); 

Mais je vous conseille de changer le code plutôt que de placer ces « hacks » dans des endroits aléatoires.

question connexe: How can I configure log4j to not print the exception stactrace

+0

Je veux éviter de toucher mes appelants à ce stade. Parce que ce sera un énorme changement pour moi. Changer les appelants est ma dernière option –

+0

donc vous dites au lieu de l'attraper et de le jeter dans le DAO .. Je devrais l'attraper et l'enregistrer dans l'appelant? N'y a-t-il pas une autre manière ou un autre paramétrage dans log4j de ne pas enregistrer certains types d'exceptions sur server.log –

+0

même s'il y en avait, ce serait toujours un 'hackery'. Il est préférable de restructurer votre code – Bozho