Получить файл журнала log4net в C#
Это моя конфигурация для log4net:
<log4net>
<appender name="MyLogger" type="log4net.Appender.RollingFileAppender">
<file value="MyLog.log" />
<appendToFile value="true" />
<rollingStyle value="Size"/>
<maxSizeRollBackups value="20"/>
<maximumFileSize value="1000KB"/>
<layout type="log4net.Layout.PatternLayout">
<param name="ConversionPattern" value="%d{yyyy-MM-dd HH:mm:ss},%p,%m%n" />
</layout>
</appender>
<root>
<level value="DEBUG" />
<appender-ref ref="MyLogger" />
</root>
</log4net>
В C# я пытаюсь получить имя файла журнала (который является MyLog.бревно.) Я погуглил и попробовал много вещей, но не сделал этого. Какая-нибудь помощь?
спасибо!
7 ответов:
решение довольно простое в вашей ситуации, просто используйте этот код:
var rootAppender = ((Hierarchy)LogManager.GetRepository()) .Root.Appenders.OfType<FileAppender>() .FirstOrDefault(); string filename = rootAppender != null ? rootAppender.File : string.Empty;
при наличии нескольких приложений файлов, вы можете получить их по имени. Кроме того, чтобы убедиться, чтобы получить приложение, даже если на него не ссылается корневой узел, следующий код помогает:
public static string GetLogFileName(string name) { var rootAppender = LogManager.GetRepository() .GetAppenders() .OfType<FileAppender>() .FirstOrDefault(fa => fa.Name == name); return rootAppender != null ? rootAppender.File : string.Empty; }
поскольку у меня уже был регистратор, определенный в классе, я просто использовал его. Одна вещь, о которой нужно знать, - это то, что может быть более одного приложения, и часто первым является консоль (у которой нет файла). Вот мое решение для того, что его стоит.
using log4net; using log4net.Appender; using log4net.Repository; namespace MyNameSpace { public class MyClass { private static readonly ILog logger = LogManager.GetLogger(typeof(MyClass)); public String GetLogFileName() { String filename = null; IAppender[] appenders = logger.Logger.Repository.GetAppenders(); // Check each appender this logger has foreach (IAppender appender in appenders) { Type t = appender.GetType(); // Get the file name from the first FileAppender found and return if (t.Equals(typeof(FileAppender)) || t.Equals(typeof(RollingFileAppender))) { filename = ((FileAppender)appender).File; break; } } return filename; } }}
если в вашей конфигурации нет узла
, то вышеуказанное решение не будет работать для вас. Читайте дальше. <log4net> <appender name="RollingFileAppender" type="log4net.Appender.RollingFileAppender"> <file value="${LOCALAPPDATA}\Anonymous.log" /> <appendToFile value="true" /> <rollingStyle value="Size" /> <maxSizeRollBackups value="10" /> <maximumFileSize value="2000KB" /> <staticLogFileName value="true" /> <layout type="log4net.Layout.PatternLayout"> <conversionPattern value="%date [%thread] %-5level %logger [%property{NDC}] - %message%newline" /> </layout> </appender> <logger name="AnonymousLog"> <level value="All" /> <appender-ref ref="RollingFileAppender" /> </logger> </log4net>это возвращает файл журнала:
string path = path = (LogManager.GetCurrentLoggers()[0].Logger.Repository.GetAppenders()[0] as FileAppender).File;(надеюсь) crash-proof версия:
string path = null; if (LogManager.GetCurrentLoggers().Length > 0 && LogManager.GetCurrentLoggers()[0].Logger.Repository.GetAppenders().Length > 0) { path = (LogManager.GetCurrentLoggers()[0].Logger.Repository.GetAppenders()[0] as FileAppender).File; }наконец, если вы застряли с log4net добавить это в раздел
: <add key="log4net.Internal.Debug" value="true"/>
String filename = null; Hierarchy hierarchy = LogManager.GetRepository() as Hierarchy; Logger logger = hierarchy.Root; IAppender[] appenders = logger.Repository.GetAppenders(); // Check each appender this logger has foreach (IAppender appender in appenders) { Type t = appender.GetType(); // Get the file name from the first FileAppender found and return if (t.Equals(typeof(FileAppender)) || t.Equals(typeof(RollingFileAppender))) { filename = ((FileAppender)appender).File; break; } } System.Diagnostics.Process.Start(filename); //for example, open file in notepad
Я не нашел выше код работает. Это сработало для меня
var filename= ((log4net.Appender.FileAppender)(((log4net.Appender.IAppender[])((((((log4net.Repository.Hierarchy.Hierarchy)((((log4net.Core.LoggerWrapperImpl)(log)).Logger).Repository)).Root).Hierarchy.Root).Appenders).SyncRoot))[0])).File
Comments