using System; using System.Collections.Generic; using System.Diagnostics; using System.IO; using System.Reflection; using System.Windows.Forms; using log4net; using log4net.Appender; using SystemX.Net.Platform.Common.ExtensionMethods; namespace SystemX.Net.Platform.Common.Util { public static class Log4NetWrapper { private static readonly LogProxy _dummyLogger = LogProxy.CreateLoggerProxy(MethodBase.GetCurrentMethod().DeclaringType); private static ILog _logger = null; public static ILog Logger { get { return _logger ?? _dummyLogger.Logger; } set { _logger = value; } } #region Extension methods [Conditional("DEBUG")] public static void DEBUG(this ILog logger, object message, Exception exception) { if (logger.IsDebugEnabled) logger.Debug(message, exception); } [Conditional("DEBUG")] public static void DEBUG(this ILog logger, object message) { if (logger.IsDebugEnabled) logger.Debug(message); } [Conditional("DEBUG")] public static void DEBUGFORMAT(this ILog logger, string format, params object[] args) { if (logger.IsDebugEnabled) logger.DebugFormat(format, args); } [Conditional("DEBUG")] public static void DEBUGFORMAT(this ILog logger, string format, object arg0) { if (logger.IsDebugEnabled) logger.DebugFormat(format, arg0); } [Conditional("DEBUG")] public static void DEBUGFORMAT(this ILog logger, string format, object arg0, object arg1) { if (logger.IsDebugEnabled) logger.DebugFormat(format, arg0, arg1); } [Conditional("DEBUG")] public static void DEBUGFORMAT(this ILog logger, string format, object arg0, object arg1, object arg2) { if (logger.IsDebugEnabled) logger.DebugFormat(format, arg0, arg1, arg2); } [Conditional("DEBUG")] public static void DEBUGFORMAT(this ILog logger, IFormatProvider provider, string format, params object[] args) { if (logger.IsDebugEnabled) logger.DebugFormat(provider, format, args); } #endregion /// /// /// /// /// xml log configuration file /// real log file name to be generated. public static void Install(IAppender mainForm, string configFile, string logFileName) { // http://stackoverflow.com/questions/2815940/where-will-log4net-create-this-log-file // see log4netXXXX.xml configuration file var appName = Path.GetFileNameWithoutExtension(Assembly.GetEntryAssembly().Location); log4net.GlobalContext.Properties["LogFileName"] = logFileName.IsNullOrEmpty() ? Path.Combine(CommonUtil.GetProfilePath(), appName) : logFileName; if ( File.Exists(configFile) ) { log4net.Config.XmlConfigurator.Configure(new System.IO.FileInfo(configFile)); ((log4net.Repository.Hierarchy.Hierarchy)LogManager.GetRepository()).Root.AddAppender(mainForm); } else MessageBox.Show(String.Format("Failed to load configuration file {0}.\r\nLog message will not be available.", configFile), appName); } /// /// 분석 대상 assembly 의 type 을 검사하여, "logger" 라는 이름의 static 멤버를 찾고, /// 사전에 해당 객체를 생성해서 등록해 둔다. /// /// /// e.g "log4net.xml" /// Logger 를 포함하는 분석 대상 assemblies /// logFileName /// e.g "logger" public static void Install(IAppender mainForm, string configFile, IEnumerable assemblies, string logFileName=null, string staticLoggerMemberName = "logger") { Install(mainForm, configFile, logFileName); List types = new List(); foreach (var assembly in assemblies) { foreach (Type t_ in assembly.GetTypes()) { Type t = t_.DeclaringType ?? t_; MemberInfo[] mis = t.GetMember(staticLoggerMemberName, BindingFlags.Static | BindingFlags.NonPublic | BindingFlags.Public); foreach (var mi in mis) { Type candidateType = mi.DeclaringType.DeclaringType ?? mi.DeclaringType; if (!types.Contains(candidateType)) { types.Add(candidateType); } } } } foreach (var type in types) LogProxy.CreateLoggerProxy(type); } } }