前言
我们需要一个日志Log去记录日常发生的信息,这样方便以后出现问题的时候回去找报错的日志
NLog
NLog 是Log的.net 移植版本,.net 将很多别的已经成熟的第三方库进行了移植。
NLog使用
使用
最简单的配置信息
<?xml version="1.0" encoding="utf-8" ?>
<nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" >
<targets>
<!--输出目标:name名称f,xsi:type输出类型文件, fileName输出到程序根目录logs文件夹中, 以日期作为生成log文件名称, layout生成内容的格式-->
<target name="f"
xsi:type="File"
fileName="${basedir}/logs/${shortdate}.txt"
layout="${date:format=yyyy-MM-dd HH\:mm\:ss} [${uppercase:${level}}] : ${message}" />
</targets>
<rules>
<!--日志路由规则:最低级别Debug,输出到target目标f-->
<logger name="*"
minlevel="Debug"
writeTo="f" />
</rules>
</nlog>
如果想输出年月日文件夹。可以修改到如下配置
<?xml version="1.0" encoding="utf-8" ?>
<nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" >
<targets>
<!--输出目标:name名称f,xsi:type输出类型文件, fileName输出到程序根目录logs文件夹中, 以日期作为生成log文件名称, layout生成内容的格式-->
<target name="f"
xsi:type="File"
fileName="${basedir}/Logs/${date:format=yyyy}/${date:format=MM}/${date:format=HH}.log"
layout="${date:format=yyyy-MM-dd HH\:mm\:ss} [${uppercase:${level}}] : ${message}" />
</targets>
<rules>
<!--日志路由规则:最低级别Debug,输出到target目标f-->
<logger name="*"
minlevel="Debug"
writeTo="f" />
</rules>
</nlog>
为了增强Error的日志鲜明性,我们将Error单独列出一个文件夹
<?xml version="1.0" encoding="utf-8" ?>
<nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" >
<targets>
<!--将Debug导出为每小时一个-->
<target name="debug"
xsi:type="File"
fileName="${basedir}/Logs/${date:format=yyyy}/${date:format=MM}/${date:format=dd}/${date:format=HH}.log"
layout="${date:format=yyyy-MM-dd HH\:mm\:ss} [${uppercase:${level}}] : ${message}" />
<!--将Error导出为每天一个,而且存放在一个Error文件夹中-->
<target name="error"
xsi:type="File"
fileName="${basedir}/Logs/${date:format=yyyy}/${date:format=MM}/Error/${date:format=dd}.log"
layout="${date:format=yyyy-MM-dd HH\:mm\:ss} [${uppercase:${level}}] : ${message}" />
</targets>
<rules>
<logger name="*"
minlevel="Debug"
writeTo="debug" />
<logger name="*"
minlevel="Error"
writeTo="error" />
</rules>
</nlog>
测试
using NLog.Config;
using NLog;
namespace FuJian_mqtt
{
internal class Program
{
static void Main(string[] args)
{
//初始化配置日志
LogManager.Configuration = new XmlLoggingConfiguration(string.Format("{0}/NLog.config", AppDomain.CurrentDomain.BaseDirectory.ToString()));
var logger = NLog.LogManager.GetCurrentClassLogger();
logger.Debug("我修改了日志sss的时间");
Console.WriteLine("Hello, World!");
}
}
}
工具类使用
搭配我之前的彩色控制台打印
彩色打印
using NLog;
using NLog.Config;
using System;
using System.Collections.Generic;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Console = Colorful.Console;//这个是重点
namespace FuJian_mqtt.Utils
{
public static class LogHelper
{
private static Logger logger;
static LogHelper()
{
LogManager.Configuration = new XmlLoggingConfiguration(string.Format("{0}/NLog.config", AppDomain.CurrentDomain.BaseDirectory.ToString()));
logger = NLog.LogManager.GetCurrentClassLogger();
}
public static void Debug(object res)
{
Console.WriteLine(res);
logger.Debug(res);
}
public static void Info(object res)
{
Console.WriteLine(res, Color.LightGreen);
logger.Info(res);
}
public static void Error(object res)
{
Console.WriteLine(res, Color.Red);
logger.Error(res);
}
public static void Warning(object res)
{
Console.WriteLine(res, Color.Yellow);
logger.Warn(res);
}
}
}
使用结果
由于Colorful.Console不在维护,对彩色打印进行修改
using NLog.Config;
using NLog;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace WpfApp1.Utils
{
public static class NLogHelper
{
private static Logger logger;
static NLogHelper()
{
LogManager.Configuration = new XmlLoggingConfiguration(string.Format("{0}/NLog.config", AppDomain.CurrentDomain.BaseDirectory.ToString()));
logger = NLog.LogManager.GetCurrentClassLogger();
}
public static void Debug(string msg)
{
Console.WriteLine(msg);
logger.Debug(msg);
}
public static void Info(string msg)
{
ConsoleWirte(msg,ConsoleColor.Green);
logger.Info(msg);
}
public static void Error(string msg)
{
ConsoleWirte(msg, ConsoleColor.Red);
logger.Error(msg);
}
public static void Warning(string msg)
{
ConsoleWirte(msg, ConsoleColor.Yellow);
logger.Warn(msg);
}
public static void ConsoleWirte(string msg,ConsoleColor color)
{
Console.ForegroundColor = color;
Console.WriteLine(msg);
Console.ResetColor();
}
}
}
以Service的方式注入
public class NlogService
{
private Logger logger;
public NlogService()
{
LogManager.Configuration = new XmlLoggingConfiguration(string.Format("{0}/NLog.config", AppDomain.CurrentDomain.BaseDirectory.ToString()));
logger = NLog.LogManager.GetCurrentClassLogger();
}
public void Debug(string msg)
{
Console.WriteLine(msg);
logger.Debug(msg);
}
public void Info(string msg)
{
ConsoleWirte(msg, ConsoleColor.Green);
logger.Info(msg);
}
public void Error(string msg)
{
ConsoleWirte(msg, ConsoleColor.Red);
logger.Error(msg);
}
public void Warning(string msg)
{
ConsoleWirte(msg, ConsoleColor.Yellow);
logger.Warn(msg);
}
public void ConsoleWirte(string msg, ConsoleColor color)
{
Console.ForegroundColor = color;
Console.WriteLine(msg);
Console.ResetColor();
}
}
带title的打印
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace UdpReciveDemo.Utils
{
public class PrintHelper
{
private NlogHelper nlogHelper;
private string title = "title";
public PrintHelper(NlogHelper nlogHelper)
{
this.nlogHelper = nlogHelper;
}
public void SetTitle(string Title)
{
title = $"[{Title}]:";
}
public void Debug(string msg)
{
nlogHelper.Debug(title+msg);
}
public void Error(string msg)
{
nlogHelper.Error(title + msg);
}
public void Warning(string msg)
{
nlogHelper.Warning(title + msg);
}
public void Info(string msg)
{
nlogHelper.Info(title + msg);
}
}
}