2014-05-22 6 views
6

Wie kann ich log4net mit Unity3d verwenden, so dass die Protokollausgabe zur Editor-Konsole geht und in der Datei protokolliert wird? Unity scheint nicht in der Lage zu sein, eine App.config zu verwenden, daher muss die Konfiguration im Code erfolgen, aber wie schreibe ich in die unity-Konsole, wenn ich log4net verwende?Wie benutzt man log4net mit Unity?

Antwort

10

Fügen Sie zuerst einen Verweis auf die log4net DLL im Unity-Editor hinzu. Sie können dies tun, indem Sie die log4net-DLLs in das Verzeichnis Assets/Plugins oder in ein untergeordnetes Verzeichnis des Verzeichnisses Assets/Plugins/ platzieren.

Sobald auf log4net verwiesen wird, müssen Sie nun die Appender einrichten, damit log4net weiß, wie die Protokollierung tatsächlich gestartet wird. Dies ist, was ich für meine Konfiguration haben:

/// <summary> 
/// Configure logging to write to Logs\EventLog.txt and the Unity console output. 
/// </summary> 
public static void ConfigureAllLogging() 
{ 
    var patternLayout = new PatternLayout 
         { 
         ConversionPattern = "%date %-5level %logger - %message%newline" 
         }; 
    patternLayout.ActivateOptions(); 

    // setup the appender that writes to Log\EventLog.txt 
    var fileAppender = new RollingFileAppender 
        { 
         AppendToFile = false, 
         File = @"Logs\EventLog.txt", 
         Layout = patternLayout, 
         MaxSizeRollBackups = 5, 
         MaximumFileSize = "1GB", 
         RollingStyle = RollingFileAppender.RollingMode.Size, 
         StaticLogFileName = true 
        }; 
    fileAppender.ActivateOptions(); 

    var unityLogger = new UnityAppender 
        { 
         Layout = new PatternLayout() 
        }; 
    unityLogger.ActivateOptions(); 

    BasicConfigurator.Configure(unityLogger, fileAppender); 
} 

Diese log4net einrichtet zu Logs\EventLog.txt Protokollierung und zur Einheit der Konsole Protokollierung über die UnityAppender Klasse. Die UnityAppender Klasse sieht so aus (ich es als eine private innere Klasse):

/// <summary> An appender which logs to the unity console. </summary> 
private class UnityAppender : AppenderSkeleton 
{ 
    /// <inheritdoc /> 
    protected override void Append(LoggingEvent loggingEvent) 
    { 
    string message = RenderLoggingEvent(loggingEvent); 

    if (Level.Compare(loggingEvent.Level, Level.Error) >= 0) 
    { 
     // everything above or equal to error is an error 
     Debug.LogError(message); 
    } 
    else if (Level.Compare(loggingEvent.Level, Level.Warn) >= 0) 
    { 
     // everything that is a warning up to error is logged as warning 
     Debug.LogWarning(message); 
    } 
    else 
    { 
     // everything else we'll just log normally 
     Debug.Log(message); 
    } 
    } 
} 

Dann sollten Sie ConfigureAllLogging() irgendwo nennen, wo Sie es wissen, genannt wird. Ich habe es in einem statischen Konstruktor eines meiner globalen Monobehavoirs gesetzt.

+0

Ein schönes Arbeitsbeispiel. Beachten Sie, dass es empfehlenswert ist, DLLs in das Verzeichnis Assets \ Plugins zu legen. –

+0

@ NikolaMalešević Guter Punkt. Ich habe die Antwort aktualisiert, um stattdessen auf Assets \ Plugins zu zeigen. – FriendlyGuy

+0

Alte Post, frage mich, ob es noch am Leben ist :) Sie müssen immer noch die log4net Logger richtig verwenden, so auf jedem Skript, das Protokollierung benötigt: 'code private statische readonly log4net.ILog log = log4net.LogManager.GetLogger (System .Reflection.MethodBase.GetCurrentMethod() .DemplingType); ' und dann: ' code log.Debug ("das ist meine Debug-Nachricht"); log.Error ("das ist meine Fehlermeldung"); log.Fatal ("das ist meine fatale Nachricht"); log.Warn ("das ist meine Warnmeldung"); ' Sorry konnte dies nicht richtig formatieren – bomanden