日志ILog(文件日志/控制台日志/控件日志/网络日志)

日志组件是NewLife系列组件最早最基础,同时也是流血流泪最多的一个模块,它的底蕴定能感动每一个用户!

没有日志的应用系统是不完整的。系统遇到啥问题,翻日志看看当时上下文,实在分析不出问题,修改代码再打几个日志……这是每一个程序员的日常写照。

不少同学喜欢调试程序,但是听过“薛定谔的猫”这个故事的人不多。有时候程序跑起来没问题,调试就有问题;有时候跑起来有问题,调试就没有问题。就像是薛定谔的猫,测不准原理,调试观察本身干涉了程序运行。这个时候就需要看日志。

单片机嵌入式设备、安卓移动应用、Linux嵌入式应用,虽然都可以在线调试,但也会有许多不方便的地方。如果能够配合使用日志,将会事半功倍。

Nuget包:NewLife.Core

源码地址:

https://github.com/NewLifeX/X/tree/master/NewLife.Core/Log

Get Started

新建控制台项目 ConsoleApp1 ,放到 D:\Test,其它目录也可以

从Nuget引用 NewLife.Core ,安装最新版本。

打开Program.cs的Main函数,写入一下代码

XTrace.UseConsole();XTrace.WriteLine("Hello NewLife!");

点击XTrace左边图标,可选“using NewLife.Log;”自动添加命名空间引用。

点击上方绿色启动三角符号,或者按下F5,启动应用程序。

可以看到打开一个控制台窗口,并输入一行日志

13:15:06.270  1 N - Hello NewLife!

这就是我们前面代码输出的内容:XTrace.WriteLine("Hello NewLife!");

这也是最简单最常见的日志用法:XTrace.WriteLine

XTrace是静态跟踪类,WriteLine等日志输出方法,本质上是调用实现了ILog接口的XTrace.Log。

日志接口ILog

ILog是日志输出标准接口

/// <summary>写日志</summary>
/// <param name="level">日志级别</param>
/// <param name="format">格式化字符串</param>
/// <param name="args">格式化参数</param>
void Write(LogLevel level, String format, params Object?[] args);/// <summary>调试日志</summary>
/// <param name="format">格式化字符串</param>
/// <param name="args">格式化参数</param>
void Debug(String format, params Object?[] args);/// <summary>信息日志</summary>
/// <param name="format">格式化字符串</param>
/// <param name="args">格式化参数</param>
void Info(String format, params Object?[] args);/// <summary>警告日志</summary>
/// <param name="format">格式化字符串</param>
/// <param name="args">格式化参数</param>
void Warn(String format, params Object?[] args);/// <summary>错误日志</summary>
/// <param name="format">格式化字符串</param>
/// <param name="args">格式化参数</param>
void Error(String format, params Object?[] args);/// <summary>严重错误日志</summary>
/// <param name="format">格式化字符串</param>
/// <param name="args">格式化参数</param>
void Fatal(String format, params Object?[] args);/// <summary>是否启用日志</summary>
Boolean Enable { get; set; }/// <summary>日志等级,只输出大于等于该级别的日志,默认Info</summary>
LogLevel Level { get; set; }

Write核心方法,很少使用,一般都使用 Info/Debug/Warn/Error/Fatal 等接口,最终都是调用Write,只是日志等级不同。

日志对象可以独立控制是否启用,以及日志等级Level。

已有日志等级:

/// <summary>日志等级</summary>
public enum LogLevel : System.Byte
{/// <summary>打开所有日志记录</summary>All = 0,/// <summary>最低调试。细粒度信息事件对调试应用程序非常有帮助</summary>Debug,/// <summary>普通消息。在粗粒度级别上突出强调应用程序的运行过程</summary>Info,/// <summary>警告</summary>Warn,/// <summary>错误</summary>Error,/// <summary>严重错误</summary>Fatal,/// <summary>关闭所有日志记录</summary>Off = 0xFF
}

文件日志

文本文件日志是最重要的日志,也是XTrace.Log的默认实现。

文本文件日志是把日志逐行输出到文本文件中,每天一个文件。

如果想要独立存储某个模块的日志,可以实例化一个专属的TextFileLog对象。推荐使用Create创建。

/// <summary>每个目录的日志实例应该只有一个,所以采用静态创建</summary>
/// <param name="path">日志目录或日志文件路径</param>
/// <param name="fileFormat"></param>
/// <returns></returns>
public static TextFileLog Create(String path, String fileFormat = null);/// <summary>每个目录的日志实例应该只有一个,所以采用静态创建</summary>
/// <param name="path">日志目录或日志文件路径</param>
/// <returns></returns>
public static TextFileLog CreateFile(String path);

文件日志内部有队列、延迟关闭等复杂逻辑,强烈建议使用单例,Create可确保单例实现。

文本文件日志主要特性:

  • 每天一个文件,例如 2021_06_25.log

  • 每个文件最大10M,(可在core.config中配置LogFileMaxBytes),超过后产生新的日志文件,例如 2021_06_25_2.log

  • 日志目录为Log子目录,(可配置LogPath)

  • 日志目录中最多只保存最新100个日志文件,(可配置LogFileBackups)

  • 日志等级,可配置LogLevel,默认Info,大于等于该等级才输出日志到文件

  • 日志文件格式,可配置LogFileFormat,默认 {0:yyyy_MM_dd}.log,也可以按照日志等级区分目录,例如 {1}/{0:yyyy_MM_dd}.log

  • 日志写入使用队列实现,避免影响应用层性能

  • 如果连续5秒没有日志写入,则自动关闭日志文件句柄,此时用户可以根据需要移动或删除日志文件

这里的10M和100个,最大日志占用1G,可以有效的避免异常信息写爆磁盘!(说多都是泪……)

来看看上面Demo的日志文件

#Software: ConsoleApp1
#ProcessID: 38144 x64
#AppDomain: ConsoleApp1
#FileName: D:\Test\ConsoleApp1\ConsoleApp1\bin\Debug\net5.0\ConsoleApp1.exe
#BaseDirectory: D:\Test\ConsoleApp1\ConsoleApp1\bin\Debug\net5.0\
#TempPath: C:\Users\Stone\AppData\Local\Temp\
#CommandLine: D:\Test\ConsoleApp1\ConsoleApp1\bin\Debug\net5.0\ConsoleApp1.dll
#ApplicationType: Console
#CLR: 5.0.7, .NET 5.0.7
#OS: Microsoft Windows NT 10.0.19042.0, X6/Stone
#CPU: 8
#GC: IsServerGC=False, LatencyMode=Interactive
#ThreadPool: Min=32/32, Max=32767/1000, Available=32766/1000
#Date: 2021-06-25
#字段: 时间 线程ID 线程池Y/网页W/普通N/定时T 线程名/任务ID 消息内容
#Fields: Time ThreadID Kind Name Message
13:42:42.463  1 N - NewLife.Core v8.10.2021.0604 Build 2021-06-07 09:05:06 .NETCoreApp,Version=v5.0
13:42:42.465  1 N - X组件核心库 ©2002-2021 NewLife
13:42:42.466  1 N - ConsoleApp1 v1.0.0 Build 2000-01-01 .NETCoreApp,Version=v5.0
13:42:42.466  1 N - ConsoleApp1 
13:42:42.466  1 N - Hello NewLife!

可以看到,日志文件非常完善,还有一个很完整的日志头。

文本日志文件格式,参考了多款微软产品,头部井号#隔开的行是注释行,用于说明情况。

通过日志头,可以了解到一下信息:

  • 软件名ConsoleApp1,取自进程名

  • 进程Id,是否64位进程

  • 应用程序域,这个现在没有太多意义了

  • 执行文件名,全路径

  • 基准目录,全路径。这个非常重要,很多人的控制台程序正常,改为系统服务以后异常,很大可能性就是因为这个基准目录变成了操作系统目录。

  • 临时目录,X组件有时候需要使用临时目录

  • 命令行参数

  • 应用类型,.NETCore里面基本上都是Console了,有点难以区分WinForm和Web

  • .NET版本,CLR版本

  • 操作系统、CPU等

  • GC设置

  • 线程池设置值。

  • 日志字段格式介绍

字段格式:

  • 时间,时分秒和毫秒。这里的毫秒特别重要,可以精确知道各个操作执行耗时情况

  • 线程Id,如果每个日志所属线程不加以区分,在多线程环境下就会一团糟

  • 线程类型,线程池Y、网页W、普通N、定时T

  • 线程名/任务Id

  • 日志内容

由此可见,日志组件特别适用于分析多线程问题。

设计如此详尽的日志头,主要为了能够准确记录程序的执行上下文环境,特别对于客户端应用来说尤为重要!

控制台日志

前面例程中,Main函数开头有一行 XTrace.UseConsole() ,意思是使用控制台日志。如果没有这一行,XTrace.WriteLine默认只会写入文本文件日志。加上后,同时写文件和控制台。

控制台日志ConsoleLog没有日志头,其它跟文本文件日志一样,输出时间、线程信息和日志内容。

控制台日志多了个彩色显示,不同线程以不同颜色区分,便于快速区分同一个线程的日志。受制于控制台颜色样本不足,某些情况下不同线程可能使用相同的颜色。内置10种颜色,线程Id对颜色个数取余。

除了WinForm和早期ASP.Net,否则一般都使用 XTrace.UseControle() 把日志同步输出到控制台。对应用性能有严格要求时,可以注意这一行关闭控制台日志。

切记!!!控制台日志不宜过多,否则会严重影响应用性能,因为控制台数据内部带有锁需要排队。

控件日志

对于WinForm应用来说,希望能够把日志输出到某个富文本框之中。控件日志TextControlLog为此而生!

XTrace中有扩展方法 UseWinFormControl :

/// <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)

在码神工具 NewLife.XCoder 的网络调试工具中,FrmMain_Load 有以下代码:

txtReceive.UseWinFormControl();

这里的txtReceive是富文本框RichTextBox,负责数据接收区,同时用于显示日志。

因此,UseWinFormControl 用于把日志重定向到富文本框,第二参数useFileLog指定继续写文件日志。

网络日志

NewLife.Core 组件也支持Android和iOS开发(基于Xamarin),由于设备上的日志很不好实时查看,因而设计了网络日志。NetworkLog通过UDP协议把日志发送到局域网某个目标地址。

配置文件core.config中指定NetworkLog配置项,例如 udp://10.0.0.3:514 ,也可以使用广播地址 udp://255.255.255.255:514 。然后在开发机 10.0.0.3 上开一个码神工具,网络工具监听UDP514端口即可接收日志。

嵌入式Linux应用开发也可以使用同样办法。

网络日志降低了我们对移动应用和嵌入式应用的调试依赖。

星尘日志中心

网络日志还有一个隐藏技能,core.config 的 NetworkLog 填写http地址时,支持星尘日志中心。例如 http://star.newlifex.com:6600/log。

网络日志内部使用队列缓冲数据,按批发送到星尘服务端,服务端分表分库存储。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/301307.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

php crypt mysql password_php使用crypt()函数进行加密

一、代码$str 应用crypt()函数进行单向加密!; //声明字符串变量$strecho 加密前$str的值为&#xff1a;.$str;$crypttostr crypt($str); //对变量$str加密echo 加密后$str的值为&#xff1a;.$crypttostr; //输出加密后的变量?>二、运行结果参数不带salt&#xff0c;每次…

.NET 容器环境下创建应用 dump 文件

.NET 容器环境下创建应用 dump 文件Intro有时候我们的应用会出现一些异常的情况&#xff0c;比如内存飙升&#xff0c;线程死锁等等&#xff0c;通过一些 metrics 我们可能大概的了解内存是增长了&#xff0c;但是具体是哪里增长了&#xff0c;单单看内存的变化很难看出来哪里导…

安装mysql二进制文件_MySQL二进制文件规范安装

演示环境介绍操作系统&#xff1a;CentOS 6.7 (64位)二进制包&#xff1a;MySQL-5.6.30-linux-glibc2.5-x86_64.tar.gzMySQL 下载地址&#xff1a;http://dev.mysql.com/downloads/1、下载MySQL# mkdir /root/mysql# cd /root/mysql# wget http://dev.mysql.com/get/Downloads…

清华体质优良可降5分录取;窃取密钥者奖百万;阿里投入1亿保护方言;腾讯不正当竞争被罚;这就是今天的大新闻...

今天是3月21日农历二月十五今天星期四网络突然变得特别的卡严重影响到我的激情下面是今天的大新闻清华体质优良可再降5分录取&#xff08;中国新闻网&#xff09;据清华大学招生办公室官方微信消息&#xff0c;2019年清华大学将继续在自主招生中开展体质测试。体质测试成绩优良…

[Android]关于IntentService

2019独角兽企业重金招聘Python工程师标准>>> IntentService其实是Service加Handler的组合&#xff0c;Handler存在于专门的HandlerThread上&#xff0c; 区别于UI thread, Service每通过onStart()收到Intent&#xff0c;则转给Handler,通过handleMessage()的方式一个…

Facebook 竟然把服务 27 亿人的 AI 硬件系统开源了?!

全世界只有3.14 % 的人关注了数据与算法之美一直以来&#xff0c;社区对 Facebook 的硬件研究比较关注。在今日的开放计算项目全球峰会上&#xff0c;Facebook 技术策略主管 Vijay Rao 开源了全新的 AI 硬件&#xff1a;面向 AI 训练与推理的硬件系统 Zion 与 Kings Canyon&…

一秒创建高级查询服务

在业务开发中&#xff0c;一个常用的功能就是“高级查询”&#xff0c;就是客户可以根据自己的需要设置查询条件查找数据&#xff0c;类似下图&#xff1a; 通常&#xff0c;我们需要为每个“高级查询”定制Dto类&#xff0c;用于传输条件&#xff0c;并要根据条件组合成查询语…

首款产后抑郁药问世;京东推出城市操作系统;阿里将推出全新销售平台;香港政府砸5300亿填海;脸书再爆隐私丑闻;这就是今天的大新闻...

今天是3月22日农历二月十六今天星期五一周就这么过去了周末得好好耍下面是今天的大新闻首款产后抑郁药问世&#xff08;红星新闻&#xff09;据美国CNN新闻3月19日报道&#xff0c;当地时间本周二&#xff08;19日&#xff09;&#xff0c;美国食品和药物管理局&#xff08;FDA…

navicat如何连接腾讯mysql_使用Navicat连接腾讯云Mysql数据库

1、安装# 安装mysql服务sudo apt-get install mysql-server# 安装客户端sudo apt install mysql-client# 安装依赖sudo apt install libmysqlclient-dev# 检查状态sudo netstat -tap | grep mysql2、设置密码root> mysqlmysql> update mysql.user set authentication_str…

WPF实现环(圆)形进度条

WPF开发者QQ群&#xff1a; 340500857 | 微信群 -> 进入公众号主页 加入组织“ 前言&#xff0c;接着上一篇圆形菜单。”欢迎转发、分享、点赞、在看&#xff0c;谢谢~。 01—效果预览效果预览&#xff08;更多效果请下载源码体验&#xff09;&#xff1a;02—代码如下一、…

JQuery上传插件Uploadify使用详解

Uploadify是JQuery的一个上传插件&#xff0c;实现的效果非常不错&#xff0c;带进度显示。不过官方提供的实例时php版本的&#xff0c;本文将详细介绍Uploadify在Aspnet中的使用&#xff0c;您也可以点击下面的链接进行演示或下载。官方下载官方文档官方演示首先按下面的步骤来…

每日一笑 | 不忘初心,最爱扫雷~

全世界只有3.14 % 的人关注了数据与算法之美&#xff08;图源网络&#xff0c;侵权删&#xff09;

在ASP.NET Core微服务架构下使用数据库切分和扩展

原文链接&#xff1a;https://itnext.io/how-to-use-database-sharding-and-scale-an-asp-net-core-microservice-architecture-22c24916590f微服务的一大优点是&#xff0c;它们可以独立扩展。本文展示了扩展一个微服务及其数据库的好处和挑战。您将创建一个示例应用程序并手动…

GridView实现数据编辑和删除(一)

2019独角兽企业重金招聘Python工程师标准>>> 前台的html代码&#xff1a; <asp:GridView ID"gv_Emplogin" runat"server" AutoGenerateColumns"False" onrowdeleting"gv_Emplogin_RowDeleting" onrowupdating"gv_…

8张图告诉你,在朋友圈发什么不会被嫌弃

爱发圈的你是否发现&#xff0c;打开朋友圈总有一些内容让你嫌弃&#xff1a;和本人真假难辨的美图自拍&#xff0c;每天十条以上的发帖&#xff0c;伪科普的转发…还有一些人你直接想删除&#xff1a;炫耀自己家的奢侈品&#xff0c;从不交摊位费的代购和微商和一日三餐都发圈…

iNeuOS工业互联网平台,在高校教学实训领域的应用

目 录1. 概述... 22. 实训柜... 23. 培训内容... 44. 二次开发培训... 51. 概述中国工业互联网从 0 向 1 演进从缺政策、缺技术、缺市场&#xff0c;逐渐转移到了缺人才&#xff0c;跨行业、跨领域的复合型人才&#xff1b;IT与OT融合型人才&#…

keepalived 原理,安装,配置

什么是Keepalived呢&#xff0c;keepalived观其名可知&#xff0c;保持存活&#xff0c;在网络里面就是保持在线了&#xff0c;也就是所谓的高可用或热备&#xff0c;用来防止单点故障(单点故障是指一旦某一点出现故障就会导致整个系统架构的不可用)的发生&#xff0c;那说到ke…

28合1智能积木,56种玩法,让孩子循序渐进“玩”出新知识

▲数据汪特别推荐点击上图进入玩酷屋小木作为一名资深积木达人&#xff0c;我可是大大小小的积木阅览无数&#xff0c;最近小木又发现一个超好玩的----28合1小卡百变积木&#xff01;小卡百变积木是小卡团队研发的一款全新概念的智能积木&#xff0c;由276颗高精度积木&#xf…

表3.5 文章管理测试用例表_本地管理表空间管理机制

表空间是一种为段&#xff08;表&#xff0c;索引等&#xff09;提供空间的逻辑结构&#xff0c;所以&#xff0c;当在表空间中增加&#xff0c;删除段的时候&#xff0c;数据库就必须跟踪这些空间的使用。如下例所示&#xff0c;假定一个新创建的表空间包含了五个表表一……表…

.NET | 多线程下的调用上下文 : CallContext

【.NET】| 总结/Edison Zhou最近在分析现在团队的项目代码&#xff08;基于.NET Framework 4.5&#xff09;&#xff0c;经常发现一个CallContext的调用&#xff0c;记得多年前的时候用到了它&#xff0c;但是印象已经不深刻了&#xff0c;于是现在来复习一下。1CallContext是个…