public class Logs
{
private static Logger logger = LogManager.GetCurrentClassLogger(); //初始化日志类

/// <summary>
/// 日志状态枚举
/// </summary>
private enum LogState
{
/// <summary>
/// 用户已登录
/// </summary>
NLogin,
/// <summary>
/// 用户未登录
/// </summary>
YLogin,
}

/// <summary>
/// 静态构造函数
/// </summary>
static Logs()
{
//初始化配置日志
LogManager.Configuration = new XmlLoggingConfiguration(System.AppDomain.CurrentDomain.BaseDirectory.ToString() + "\\Demo\\NLog.config");
}

/// <summary>
/// 日志写入通用方法(建议使用)
/// </summary>
/// <param name="msg">日志内容</param>
/// <param name="logType"> 日志类别
/// 类别: 1.Debug
/// 2.Info
/// 3.Error
/// 4.Fatal
/// 5.Warn
/// </param>
/// <param name="loginState">登录状态 true:有用户登录信息 false 无用户登录信息</param>
/// <remarks>
/// 注:默认类型为Info 可以配置其他日志 logType用于反射 规则一定要准确
/// 例: 1.默认日志 LogWriter("test log"); 正常的业务日志
/// 2.异常日志 LogWriter("test log","Fatal"); try catch 里请使用这个日志级别
///
/// </remarks>
public static void LogWriter(String msg, String logType = "Info", bool loginState = true)
{
try
{
String logMethod = ""; //调用者类名和方法名
if (logType == "Fatal")
{
StackTrace trace = new StackTrace();
//获取是哪个类来调用的
String invokerType = trace.GetFrame(1).GetMethod().DeclaringType.Name;
//获取是类中的那个方法调用的
String invokerMethod = trace.GetFrame(1).GetMethod().Name;
logMethod = invokerType + "." + invokerMethod + " | ";
}

String IP = HttpContext.Current.Request.UserHostAddress; //获取IP
//反射执行日志方法
Type type = typeof(Logger);
MethodInfo method = type.GetMethod(logType, new Type[] { typeof(String) });
if (loginState == true)
{
//如果是登陆状态 可以记录用户的登陆信息 比如用户名,Id等
method.Invoke(logger, new object[] { logMethod + msg + " [ " + IP + " | " + LogState.NLogin + " ]" });
}
else
{
method.Invoke(logger, new object[] { logMethod + msg + " [ " + IP + " | " + LogState.NLogin + " ]" });
}
}
catch
{
//日志代码错误,直接记录日志
Fatal(msg);
Warn(msg);
}
}

/// <summary>
/// 调试日志
/// </summary>
/// <param name="msg">日志内容</param>
private static void Debug(String msg)
{
logger.Debug(msg);
}

/// <summary>
/// 信息日志
/// </summary>
/// <param name="msg">日志内容</param>
/// <remarks>
/// 适用大部分场景
/// 1.记录日志文件
/// </remarks>
private static void Info(String msg)
{
logger.Info(msg);
}

/// <summary>
/// 错误日志
/// </summary>
/// <param name="msg">日志内容</param>
/// <remarks>
/// 适用异常,错误日志记录
/// 1.记录日志文件
/// </remarks>
private static void Error(String msg)
{
logger.Error(msg);
}

/// <summary>
/// 严重致命错误日志
/// </summary>
/// <param name="msg">日志内容</param>
/// <remarks>
/// 1.记录日志文件
/// 2.控制台输出
/// </remarks>
private static void Fatal(String msg)
{
logger.Fatal(msg);
}

/// <summary>
/// 警告日志
/// </summary>
/// <param name="msg">日志内容</param>
/// <remarks>
/// 1.记录日志文件
/// 2.发送日志邮件
/// </remarks>
private static void Warn(String msg)
{
try
{
logger.Warn(msg);
}
catch { }
}
}

web项目下面添加一个Demo文件夹创建Nlog.Config

<?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" throwExceptions="true">

<targets xsi:type="AsyncWrapper">
<!--保存至文件-->
<target name="log_file" xsi:type="File"
fileName="${basedir}/Logs/${shortdate}/${level:uppercase=false:padding=-5}.txt"
layout="${longdate} | ${message} ${onexception:${exception:format=tostring} ${newline} ${stacktrace} ${newline}" />
<!--输出至Debugger-->
<target name="debugger" xsi:type="Debugger"
layout="NLog: ${date:format=HH\:mm\:ss} | ${message}" />
<!--输出至控制台-->
<target name="console" xsi:type="ColoredConsole" layout="${longdate} ${message} ${exception:format=tostring}"></target>
<!--输出至邮件-->
<target xsi:type="Mail" name="infoMail"
smtpServer="smtp.163.com"
smtpPort="25"
smtpAuthentication="Basic"
smtpUserName="deno@163.com"
smtpPassword="demo"
enableSsl="true"
addNewLines="true"
from="demo@163.com"
to="demo@qq.com"
subject="Project Exception Mail"
header="*********************"
body="${longdate} | ${message} "
footer="*********************"/>
</targets>

<rules>
<logger name="*" level="Info" writeTo="log_file" />
<logger name="*" levels="Error" writeTo="log_file" />
<logger name="*" levels="Debug" writeTo="log_file" />
<!--<logger name="*" level="Debug" writeTo="debugger" />-->
<!--<logger name="*" level="Fatal" writeTo="console" />-->
<logger name="*" level="Fatal" writeTo="log_file" />
<!--<logger name="*" level="Warn" writeTo="infoMail" />-->
<logger name="*" level="Warn" writeTo="log_file" />
</rules>
</nlog>

.net日志的用法的更多相关文章

  1. PHP中错误与异常的日志记录用法分析

    原文:http://www.jb51.net/article/89548.htm ----------------------------------------------------------- ...

  2. java中错误日志的用法

    1.maven包:将下面的maven加入到pom.xml <!-- https://mvnrepository.com/artifact/log4j/log4j --><depend ...

  3. 命令分析nginx访问日志的用法

    awk分析日志常用高级使用命令方法 分析访问日志(Nginx为例) 日志格式: '$remote_addr - $remote_user [$time_local] "$request&qu ...

  4. java日志文件用法总结

    1.基本概念 日志门面(接口):commons logging ; slf4j ; 日志具体实现:log4j ; logback(Spring 系列在使用) ; log4j2(添加了异步logger的 ...

  5. python中logging日志基本用法,和进程安全问题

    低配版 import logging logging.debug('debug message') # 调试模式 logging.info('info message') # 正常运转模式 loggi ...

  6. 通过Oracle补充日志,找到锁阻塞源头的SQL

    问题背景: 有时会考虑一件事情,如果在Oracle环境下出现了锁阻塞的情况,如何定位到SQL源头(通过session.lock.transaction等视图仅能定位到会话)?或许有人会想有没有可能通过 ...

  7. 最方便最好看最好用的python日志。

    这个日志没有依赖自己的其他包,复制即可运行,也可以从pypi网站上下载或者pip来安装这个日志. 1.日志内置了7种模板,其中模版4和模板5,可以实现点击日志跳转到指定文件指定行数的功能,史无前例的实 ...

  8. 日志那点事儿——slf4j源码剖析

    前言: 说到日志,大多人都没空去研究,顶多知道用logger.info或者warn打打消息.那么commons-logging,slf4j,logback,log4j,logging又是什么关系呢?其 ...

  9. python之ATM

    每次做一点就发出来,大神不要嫌重复 2016/11/4 今天来搞ATM,反正逃不了的,说来惭愧,这个作业是我10/4号20天前拿到的,当时是万脸蒙比的,今天又做了一点,现在算是百脸蒙比吧. 一.需求: ...

随机推荐

  1. Navicat连接阿里云服务器MSQL数据库

    新买了台服务器Navicat老是连接不上数据库,查找一圈找到解决办法.So Easy 一.shell远程登录,进入数据库 mysql -uroot -p 二.输入以下命令进行授权: GRANT ALL ...

  2. Codeforces 922 思维贪心 变种背包DP 质因数质数结论

    A #include <bits/stdc++.h> #define PI acos(-1.0) #define mem(a,b) memset((a),b,sizeof(a)) #def ...

  3. zabbix命令之:zabbix_get命令

    zabbix_get命令是在server端用来检查agent端的一个命令,在添加完主机或者触发器后,不能正常获得数据,可以用zabbix_get来检查能否采集到数据,以便判断问题症结所在. zabbi ...

  4. css3-文字与字体

    1. 给文字添加阴影---text-shadow 语法: text-shadow: X-Offset Y-Offset blur color; X-Offset:表示阴影的水平偏移距离,其值为正值时阴 ...

  5. 前端之HTML:HTML

    前端基础之html 一.初始html 1.web服务本质 import socket sock=socket.socket(socket.AF_INET,socket.SOCK_STREAM) soc ...

  6. SpringBoot---Kafka

    1.实战 <!-- https://mvnrepository.com/artifact/org.apache.kafka/kafka --> <dependency> < ...

  7. [ethereum源码分析](3) ethereum初始化指令

    前言 在上一章介绍了关于区块链的一些基础知识,这一章会分析指令 geth --datadir dev/data/02 init private-geth/genesis.json 的源码,若你的eth ...

  8. 170911-关于maven的知识点

    简介:    什么是maven 是apache下的一个开源项目,是纯java开发,并且只是用来管理java项目的. Maven的好处? 节省空间 就是对jar包的统一管理就是对jar包的统一管理,依赖 ...

  9. POJ 1380 Equipment Box (暴力枚举)

    Equipment Box 题目链接: http://acm.hust.edu.cn/vjudge/contest/130510#problem/B Description There is a la ...

  10. 30 年前的圣诞节,Python 序章被谱写

    1989 年圣诞节期间,已经从阿姆斯特丹大学(University of Amsterdam)获得数学和计算机硕士学位的 Guido van Rossum,为了打发圣诞节的无趣,决心开发一个新语言解释 ...