/// <summary> /// 获取日志消息 /// </summary> /// <param name="content">日志内容</param> private string GetMessage(ILogContent content) { var caption = content as ICaption; if (caption != null && string.IsNullOrWhiteSpace(caption.Caption) == false) { return(caption.Caption); } if (content.Content.Length > 0) { return(content.Content.ToString()); } return(content.TraceId); }
/// <summary> /// 创建事件生成器 /// </summary> private el.EventBuilder CreateBuilder(LogLevel level, ILogContent content) { if (content.Exception != null && (level == LogLevel.Error || level == LogLevel.Critical)) { return(_client.CreateException(content.Exception)); } var builder = _client.CreateLog(GetMessage(content), ConvertTo(level)); if (content.Exception != null && level == LogLevel.Warning) { builder.SetException(content.Exception); } return(builder); }
public string Format(ILogContent content) { if (content is ILogText text) { return(text.Text); } if (content is ILogMessage message) { return(FormatLogMessage(message)); } throw new NotImplementedException($"The default formatter is not yet implemented for log content of type {content.GetType()}!"); }
/// <summary> /// 追加内容 /// </summary> public static void Append(this ILogContent content, StringBuilder result, string value, params object[] args) { if (string.IsNullOrWhiteSpace(value)) { return; } result.Append(" "); if (args == null || args.Length == 0) { result.Append(value); return; } result.AppendFormat(value, args); }
/// <summary> /// 添加扩展属性集合 /// </summary> /// <param name="builder">事件生成器</param> /// <param name="content">日志转换器</param> private void AddExtraProperties(EventBuilder builder, ILogContent content) { if (content == null) { return; } foreach (var parameter in content.ExtraProperties) { if (string.IsNullOrWhiteSpace(parameter.Value.SafeString())) { continue; } builder.SetProperty(parameter.Key, parameter.Value); } }
public void Notify(ILogContent content) { switch (content) { case ILogText text: AppendLogText(text); break; case ILogMessage message: AppendLogMessage(message); break; default: throw new NotImplementedException($"The log window is not yet implemented for log content of type {content.GetType()}!"); } }
/// <summary> /// 写日志 /// </summary> /// <param name="level">日志等级</param> /// <param name="content">日志内容</param> public void WriteLog(LogLevel level, ILogContent content) { var provider = GetFormatProvider(); var logEventLevel = ConvertTo(level); if (logEventLevel == null) { return; } if (provider == null) { throw new NullReferenceException("日志格式化提供程序不可为空"); } var message = provider.Format("", content, null); _logger.Write(logEventLevel.SafeValue(), message); }
/// <summary> /// 写日志 /// </summary> /// <param name="level">平台日志等级</param> /// <param name="content">日志内容</param> public void WriteLog(LogLevel level, ILogContent content) { var builder = CreateBuilder(level, content); // 致命错误 if (level == LogLevel.Fatal || level == LogLevel.Error) { builder.MarkAsCritical(); } SetUser(content); SetSource(builder, content); SetReferenceId(builder, content); SetException(builder, content); AddProperties(builder, content as ILogConvert); AddExtraProperties(builder, content); AddTags(builder, content); builder.Submit(); }
/// <summary> /// 写日志 /// </summary> /// <param name="level">平台日志等级</param> /// <param name="content">日志内容</param> public void WriteLog(LogLevel level, ILogContent content) { var builder = CreateBuilder(level, content); // 致命错误 if (level == LogLevel.Fatal || level == LogLevel.Error) { builder.MarkAsCritical(); } Debug.WriteLine($"【Exceptionless】Thread: {content.ThreadId}, LogId: {content.LogId}, TraceId: {content.TraceId}, Message: {GetMessage(content)}, Tags: [{content.Tags.ExpandAndToString()}]"); SetUser(content); SetSource(builder, content); SetReferenceId(builder, content); SetException(builder, content); AddProperties(builder, content as ILogConvert); AddExtraProperties(builder, content); AddTags(builder, content); builder.Submit(); }
/// <summary> /// 设置跟踪号 /// </summary> /// <param name="builder">事件生成器</param> /// <param name="content">日志内容</param> private void SetReferenceId(EventBuilder builder, ILogContent content) { builder.SetReferenceId($"{content.TraceId}-{content.Order}"); }
/// <summary> /// 设置内容并换行 /// </summary> /// <param name="content">日志内容</param> /// <param name="value">值</param> /// <param name="args">变量值</param> public static void Content(this ILogContent content, string value, params object[] args) { content.AppendLine(content.Content, value, args); }
/// <summary> /// 追加内容并换行 /// </summary> public static void AppendLine(this ILogContent content, StringBuilder result, string value, params object[] args) { content.Append(result, value, args); result.AppendLine(); }
public void Notify(ILogContent content) { logContent.Enqueue(content); }
/// <summary> /// 设置跟踪号 /// </summary> private void SetReferenceId(EventBuilder builder, ILogContent content) { builder.SetReferenceId(content.TraceId); }
/// <summary> /// /// </summary> /// <param name="content"></param> /// <param name="value"></param> public static void Content(this ILogContent content, string value) { content.AppendLine(content.Content, value); }
/// <summary> /// 设置来源 /// </summary> /// <param name="builder">事件生成器</param> /// <param name="content">日志内容</param> private void SetSource(EventBuilder builder, ILogContent content) { if (string.IsNullOrWhiteSpace(content.Url)) return; builder.SetSource(content.Url); }
/// <summary> /// 添加扩展属性 /// </summary> /// <param name="content">日志内容</param> /// <param name="name">名称</param> /// <param name="value">值</param> public static void AddExtraProperty(this ILogContent content, string name, object value) => content.ExtraProperties[name] = value;
/// <summary> /// 添加标签 /// </summary> /// <param name="builder">事件生成器</param> /// <param name="content">日志内容</param> private void AddTags(EventBuilder builder, ILogContent content) => builder.AddTags(content.Level, content.LogName, content.TraceId);
/// <summary> /// 格式化 /// </summary> /// <param name="content">日志内容</param> public string Format(ILogContent content) { return(string.Empty); }
/// <summary> /// 设置跟踪号 /// </summary> /// <param name="builder">事件生成器</param> /// <param name="content">日志内容</param> private void SetReferenceId(EventBuilder builder, ILogContent content) => builder.SetReferenceId($"{content.LogId}");
/// <summary> /// 追加内容 /// </summary> public static void Append( this ILogContent content, StringBuilder result, string value ) { if( string.IsNullOrWhiteSpace( value ) ) return; result.Append( value ); }
/// <summary> /// 添加标签 /// </summary> /// <param name="builder">事件生成器</param> /// <param name="content">日志内容</param> private void AddTags(EventBuilder builder, ILogContent content) { builder.AddTags(content.Level, content.LogName, content.TraceId); if (content.Tags.Any()) builder.AddTags(content.Tags.ToArray()); }
/// <summary> /// 写日志 /// </summary> /// <param name="level">日志等级</param> /// <param name="content">日志内容</param> public void WriteLog(LogLevel level, ILogContent content) { }
/// <summary> /// /// </summary> public static void AppendLine(this ILogContent content, StringBuilder result, string value) { content.Append(result, value); result.AppendLine(); }
/// <summary> /// 获取内容 /// </summary> /// <typeparam name="T">日志内容类型</typeparam> /// <returns></returns> public T Get <T>() where T : ILogContent { ILogContent content = LogContent; return((T)content); }
/// <summary> /// 设置用户信息 /// </summary> /// <param name="content">日志内容</param> private void SetUser(ILogContent content) { if (string.IsNullOrWhiteSpace(content.UserId)) return; _client.Configuration.SetUserIdentity(content.UserId); }
/// <summary> /// 格式化 /// </summary> /// <param name="content">日志内容</param> /// <returns></returns> public string Format(ILogContent content) { return(""); }
/// <summary> /// 格式化 /// </summary> /// <param name="content">日志内容</param> public string Format(ILogContent content) => "";