/// <summary> /// 2012.11.05 修正初次调用的时候,由于同步BUG,导致Log为空的问题。 /// </summary> static Boolean InitLog() { /* * 日志初始化可能会除法配置模块,其内部又写日志导致死循环。 * 1,外部写日志引发初始化 * 2,标识日志初始化正在进行中 * 3,初始化日志提供者 * 4,此时如果再次引发写入日志,发现正在进行中,放弃写入的日志 * 5,标识日志初始化已完成 * 6,正常写入日志 */ if (_Log != null) { return(true); } if (_initing > 0 && _initing == Thread.CurrentThread.ManagedThreadId) { return(false); } lock (_lock) { if (_Log != null) { return(true); } _initing = Thread.CurrentThread.ManagedThreadId; _Log = TextFileLog.Create(LogPath); var set = Setting.Current; if (!set.NetworkLog.IsNullOrEmpty()) { var nlog = new NetworkLog(NetHelper.ParseEndPoint(set.NetworkLog, 514)); _Log = new CompositeLog(_Log, nlog); } _initing = 0; } WriteVersion(); return(true); }
/// <summary>在WinForm控件上输出日志,主要考虑非UI线程操作</summary> /// <remarks>不是常用功能,为了避免干扰常用功能,保持UseWinForm开头</remarks> /// <param name="control">要绑定日志输出的WinForm控件</param> /// <param name="useFileLog">是否同时使用文件日志,默认使用</param> /// <param name="maxLines">最大行数</param> public static void UseWinFormControl(this Control control, Boolean useFileLog = true, Int32 maxLines = 1000) { var clg = _Log as TextControlLog; var ftl = _Log as TextFileLog; if (_Log is CompositeLog cmp) { ftl = cmp.Get <TextFileLog>(); clg = cmp.Get <TextControlLog>(); } // 控制控制台日志 if (clg == null) { clg = new TextControlLog(); } clg.Control = control; clg.MaxLines = maxLines; if (!useFileLog) { Log = clg; if (ftl != null) { ftl.Dispose(); } } else { if (ftl == null) { ftl = TextFileLog.Create(null); } Log = new CompositeLog(clg, ftl); } }