2011-03-11 3 views
12

Je suis en train de mettre en œuvre un journal simple en utilisant Nlog Refresh 1.0 pour un projet de bibliothèque de classe. Il semble que nlog ne crée pas de fichier journal lorsqu'il est instancié depuis une DLL.Comment utiliser NLog pour une DLL

Y at-il une autre façon de contourner cela?

mon fichier de configuration ressemble à ceci:

<nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd" 
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
     throwExceptions="true"> 

    <targets> 
     <target name="file" xsi:type="File" fileName="${basedir}/nlog.txt" /> 
     <target name="console" xsi:type="Console" /> 
    </targets> 

    <rules> 
     <logger name="*" minlevel="Info" writeTo="file" /> 
     <logger name="*" minlevel="Info" writeTo="console" /> 
    </rules> 

</nlog> 

Je sais qu'il n'y a rien de mal avec cette config car il fonctionne à partir d'un projet exe.

Modifier: juste pour clarifier: Je n'ai pas accès au programme appelant qui utilise ma DLL en tant que plugin. Le programme appelant est en fait Outlook qui utilise ma DLL en tant que plugin. Je voudrais garder un journal qui est seulement pertinent pour ma DLL et n'a rien à voir avec les perspectives lui-même.

Répondre

32

vous devez ajouter le nlog.config à l'emplacement du fichier exe qui utilise le dll!

Edit: Vous ne devez pas modifier le fichier exe il suffit de placer le nlog.config dans le même répertoire, si ce n'est pas l'option que je suppose que vous devrez le configurer à partir du code https://github.com/nlog/NLog/wiki/Configuration-API

+2

J'ai modifié ma question, je n'ai pas accès à l'exe qui appelle mon dll, je préférerais vouloir configurer le nlog de withing mon dll. – Oysio

+2

Cela doit être marqué comme "réponse" car @Petoj a pointé avec précision pour utiliser l'API de configuration comme solution. Mon Upvote! – dotnetguy

2

vous devriez Placez le fichier de configuration comme ci-dessus dans le fichier web.config pour les applications Web ou dans le fichier app.config pour les applications Windows. Ce n'est pas fait automatiquement et si votre bibliothèque de classes a une app.config, elle n'est de toute façon pas utilisée lorsque la bibliothèque de classes est appelée par une autre application.

+3

nlog supporte nlog.config en tant que standalone donc vous ne devez pas l'ajouter dans le web.config/app.config – Peter

5

NLog recherchera un fichier de configuration de l'exe qui inclut votre DLL. Vous aurez donc besoin de copier un fichier de configuration pour NLog chaque fois que vous voulez utiliser votre DLL.

En théorie, cela est le modèle de conception correcte que de nombreuses applications tierces peuvent utiliser votre DLL de différentes manières et aimeraient avoir les journaux de votre DLL centralisée avec leurs journaux. Dans mon cas (et peut-être votre), nous voulions nous assurer à 100% que les logs de la DLL sont sauvegardés en utilisant notre propre fichier de configuration, pour nous assurer que toutes les erreurs fatales sont signalées à notre serveur SqlServer etc. ne souhaite pas que l'application tierce définisse sa propre logique de journalisation.

Nous avons eu le même problème où NLog (ou Log4Net) n'a pas pu trouver le fichier de configuration, donc aucune activité de journalisation n'a été démarrée et aucun message d'exception/erreur n'a été imprimé depuis NLog ou Log4Net.

La seule alternative consiste à configurer NLog (ou Log4Net) dans votre DLL en utilisant le code. NLog vous fournit une API de configuration afin que vous puissiez abandonner les fichiers de configuration. Dans mon cas, j'ai une classe statique appelée 'Utils' dans ma DLL, qui est appelée à partir de toute classe tierce qui utilise ma DLL (par exemple, Utils.doSomething()). Donc je configurer NLog dans un constructeur statique:

static void Utils() // static constructor 
{ 
    // Step 1. Create configuration object 
    var config = new LoggingConfiguration(); 

    // Step 2. Create targets and add them to the configuration 
    var consoleTarget = new ColoredConsoleTarget(); 
    config.AddTarget("console", consoleTarget); 

    var fileTarget = new FileTarget(); 
    config.AddTarget("file", fileTarget); 

    // Step 3. Set target properties 
    consoleTarget.Layout = @"${date:format=HH\:mm\:ss} ${logger} ${message}"; 
    fileTarget.FileName = @"C:\global-logs\logs.txt"; 
    fileTarget.Layout = "${message}"; 
    // Step 4. Define rules 
    var rule1 = new LoggingRule("*", LogLevel.Debug, consoleTarget); 
    config.LoggingRules.Add(rule1); 

    var rule2 = new LoggingRule("*", LogLevel.Debug, fileTarget); 
    config.LoggingRules.Add(rule2); 

    // Step 5. Activate the configuration 
    LogManager.Configuration = config; 
} 
+0

Pouvez-vous expliquer un peu plus? –

+0

Modifié. Cela vous aide-t-il? – TheWalkingPanda

Questions connexes