接触.net项目的同志们都清楚,最初在项目中记录日志常用的是log4net日志组件,随着.net框架的不对优化升级,最近新流行的日志框架nlog,下面我就对nlog组件说说自己的认知:

下载

通过Nuget安装NLog

 配置

在项目根目录下新建一个NLog.config(在Nuget包中也可以下载NLog.config包,下载默认的位置是C盘,可能和你的工程不在同一个文件夹,不建议使用),基本目录结构:targets下面配置日志输出目标及相关参数,rules下面配置目标输出规则:

 <?xml version="1.0" ?>
<nlog>
<targets>
<target></target>
<target></target>
</targets>
<rules>
<logger></logger>
<logger></logger>
</rules>
</nlog>

NLog.config

记得在NLog.config的属性中设置 Copy to Output Directory: Copy always,作用是每次重新生成解决方案的时候都会将改配置文件复制的本地目录,否则本地找不到配置文件无法将日志记录到文件中:

完整的配置文件如下,日志配置文件尽量单独创建一个文件:

 <?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>
<!--写入文件-->
<target xsi:type="File" name="DebugFile" fileName="Logs\Debug\${shortdate}.log"
layout="日志时间:${longdate}${newline}日志来源:${callsite}${newline}日志级别:${uppercase:${level}}${newline}消息内容:${message}${newline}异常信息:${exception}${newline}==============================================================${newline}" >
</target>
<target xsi:type="File" name="InfoFile" fileName="Logs\Info\${shortdate}.log"
layout="日志时间:${longdate}${newline}日志来源:${callsite}${newline}日志级别:${uppercase:${level}}${newline}消息内容:${message}${newline}异常信息:${exception}${newline}==============================================================${newline}" >
</target>
<target xsi:type="File" name="ErrorFile" fileName="Logs\Error\${shortdate}.log"
layout="日志时间:${longdate}${newline}日志来源:${callsite}${newline}日志级别:${uppercase:${level}}${newline}消息内容:${message}${newline}异常信息:${exception}${newline}==============================================================${newline}" >
</target> <target xsi:type="Database" name="NewDatabase" >
<dbProvider>System.Data.SqlClient</dbProvider>
<connectionString>
Data Source=127.0.0.1;Initial Catalog=FlightAnalysis;Persist Security Info=true;User ID=sa;Password=;
</connectionString>
<commandText>
insert into OperatorLog(Id,AppName,ModuleName,ProcName,OperationType,Logger,LogMessage,IP,UserName,LogLevel)
<!--values(@Id,'','','',,'','','','','',getdate())-->
values(@Id,@AppName,@ModuleName,@ProcName,@OperationType,@Logger,@LogMessage,@IP,@UserName,@LogLevel)
</commandText>
<parameter name="@Id" layout="${event-context:item=Id}" />
<parameter name="@AppName" layout="${event-context:item=AppName}" />
<parameter name="@ModuleName" layout="${event-context:item=ModuleName}" />
<parameter name="@ProcName" layout="${event-context:item=ProcName}" />
<parameter name="@OperationType" layout="${event-context:item=OperationType}" />
<parameter name="@Logger" layout="${event-context:item=Logger}" />
<parameter name="@LogMessage" layout="${event-context:item=LogMessage}" />
<parameter name="@IP" layout="${event-context:item=IP}" />
<parameter name="@Longdate" layout="${event-context:item=Longdate}" />
<parameter name="@UserName" layout="${event-context:item=UserName}" />
<parameter name="@Createdate" layout="${longdate}" />
<parameter name="@LogLevel" layout="${level}" />
</target>
</targets> <rules>
<!--根据日志级别分别写文件,也可以放一个文件中-->
<!--<logger name="DbLogger" levels="Debug,Info,Error" writeTo="MyFile" />-->
<logger name="MyLogger" level="Debug" writeTo="DebugFile" />
<logger name="MyLogger" level="Info" writeTo="InfoFile" />
<logger name="MyLogger" level="Error" writeTo="ErrorFile" />
<!--写数据库-->
<logger name="MyLogger" levels="Trace,Debug,Info,Error" writeTo="NewDatabase"/>
</rules>
</nlog>

NLog.config

  • 如在根节点(nlog)配置 internalLogLevel, internalLogFile,可以查看NLog输出日志时的内部信息,比如你配置文件有错误,很有帮助,不过项目发布后还是关闭比较好,以免影响效率;
  • 在target外面罩了一个 <target>并且xsi:type为 AsyncWrapper,即表示这条 target 将异步输出,这里我将文件和数据库日志异步输出;
  • db target内指定了数据库连接字符串 connectionString,SQL语句,SQL参数,还可以指定数据库/表创建和删除的脚本(推荐看NLog源码示例,这里不介绍),同时我们自定义了2个参数 action和amount;
  • target参数里有些是NLog内置参数,比如message,level,date,longdate,exception,stacktrace等,NLog在输出时会自动赋值;
  • layout设置了每条日志的格式;
  • 在rules节点,我们分别指定了三个target输出日志的级别,NLog 用于输出日志的级别包括:Trace,Debug,Info,Warn,Error,Fatal,可以设置 minlevel设置最小级别,也可以用 levels定义你所有需要的级别(多个用逗号分隔)。
  • event-context代表自定义的参数。

数据库连接示例: https://www.cnblogs.com/weiweictgu/p/5848805.html

路由规则(Rules)

<rules />区域定义了日志的路由规则。每一个路由表项就是一个<logger />元素。<logger />有以下属性:

  1. name - 日志源/记录者的名字 (允许使用通配符*)
  2. minlevel - 该规则所匹配日志范围的最低级别
  3. maxlevel - 该规则所匹配日志范围的最高级别
  4. level - 该规则所匹配的单一日志级别
  5. levels - 该规则所匹配的一系列日志级别,由逗号分隔。
  6. writeTo - 规则匹配时日志应该被写入的一系列目标,由逗号分隔。
  7. final - 标记当前规则为最后一个规则。其后的规则即时匹配也不会被运行

封装

对NLog.config的Logger进行简单封装:

  /// <summary>
/// 日志类,只提供接口
/// 2018-11-6 15:32:01
/// </summary>
public class Logger
{
#region 初始化
//获取指定的名称为logger。
//private static NLog.Logger _dblogger = NLog.LogManager.GetLogger("MyLogger");
/// <summary>
/// 日事件间类
/// </summary>
private LogEventInfo lei = new LogEventInfo();
/// <summary>
/// 数据错误无法获取用户时使用
/// </summary>
public static string DefaultUser = "system";
/// <summary>
/// 默认IP地址
/// </summary>
public static string DefaultIP = "127.0.0.1";
/// <summary>
/// 提供日志接口和实用程序功能
/// </summary>
private NLog.Logger _logger = null;
/// <summary>
/// 自定义日志对象供外部使用
/// </summary>
public static Logger Default { get; private set; } private Logger(NLog.Logger logger)
{
_logger = logger;
}
public Logger(string name) : this(LogManager.GetLogger(name))
{ } static Logger()
{
//获取具有当前类名称的日志程序。
Default = new Logger("MyLogger");
}
#endregion #region Debug
public void Debug(string msg, params object[] args)
{
_logger.Debug(msg, args);
} public void Debug(string msg, Exception err)
{
_logger.Debug(err, msg);
}
#endregion #region Info
public void Info(string msg, params object[] args)
{
_logger.Info(msg, args);
} public void Info(string msg, Exception err)
{
_logger.Info(err, msg);
}
#endregion #region Warn
/// <summary>
///警告
/// </summary>
/// <param name="msg">警告信息</param>
/// <param name="args">动态参数</param>
public void Warn(string msg, params object[] args)
{
_logger.Warn(msg, args);
}
/// <summary>
///警告
/// </summary>
/// <param name="msg">警告信息</param>
/// <param name="err">异常信息</param>
public void Warn(string msg, Exception err)
{
_logger.Warn(err, msg);
}
#endregion #region Trace
/// <summary>
/// 使用指定的参数在跟踪级别写入诊断消息
/// </summary>
/// <param name="msg">跟踪信息</param>
/// <param name="args">动态参数</param>
public void Trace(string msg, params object[] args)
{
_logger.Trace(msg, args);
}
/// <summary>
/// 使用指定的参数在跟踪级别写入诊断消息
/// </summary>
/// <param name="msg">跟踪信息</param>
/// <param name="args">异常信息</param>
public void Trace(string msg, Exception err)
{
_logger.Trace(err, msg);
}
#endregion #region Error
/// <summary>
/// 使用指定的参数在错误级别写入诊断消息。
/// </summary>
/// <param name="msg">错误信息</param>
/// <param name="args">动态参数</param>
public void Error(string msg, params object[] args)
{
_logger.Error(msg, args);
}
/// <summary>
/// 使用指定的参数在错误级别写入诊断消息。
/// </summary>
/// <param name="msg">错误信息</param>
/// <param name="args">异常信息</param>
public void Error(string msg, Exception err)
{
_logger.Error(err, msg);
}
#endregion #region Fatal
/// <summary>
/// 使用指定的参数在致命级别写入诊断消息。
/// </summary>
/// <param name="msg">致命错误</param>
/// <param name="args">动态参数</param>
public void Fatal(string msg, params object[] args)
{
_logger.Fatal(msg, args);
}
/// <summary>
/// 使用指定的参数在致命级别写入诊断消息。
/// </summary>
/// <param name="msg">致命错误</param>
/// <param name="args">异常信息</param>
public void Fatal(string msg, Exception err)
{
_logger.Fatal(err, msg);
}
/// <summary>
/// 刷新所有挂起的日志消息(在异步目标的情况下)。
/// </summary>
/// <param name="timeoutMilliseconds">最大的时间允许冲洗。此后的任何消息都将被丢弃。</param>
public void Flush(int? timeoutMilliseconds = null)
{
if (timeoutMilliseconds != null)
NLog.LogManager.Flush(timeoutMilliseconds.Value); NLog.LogManager.Flush();
}
#endregion #region Operator日志写入
/// <summary>
/// 写入日志信息
/// </summary>
/// <param name="operatorLogModel">操作信息</param>
public void InsOperatorLog(OperatorLogModel operatorLogModel)
{
var level = LogLevel.Info;
if (operatorLogModel.LogLevel == NLog.LogLevel.Trace)
level = LogLevel.Trace;
else if (operatorLogModel.LogLevel == NLog.LogLevel.Debug)
level = LogLevel.Debug;
else if (operatorLogModel.LogLevel == NLog.LogLevel.Info)
level = LogLevel.Info;
else if (operatorLogModel.LogLevel == NLog.LogLevel.Warn)
level = LogLevel.Warn;
else if (operatorLogModel.LogLevel == NLog.LogLevel.Error)
level = LogLevel.Error;
else if (operatorLogModel.LogLevel == NLog.LogLevel.Fatal)
level = LogLevel.Fatal; if (operatorLogModel.LogMessage.Length > )
{
operatorLogModel.LogMessage = operatorLogModel.LogMessage.Substring(, );
}
lei.Properties["Id"] = Guid.NewGuid().ToString("D");
lei.Properties["AppName"] = operatorLogModel.AppName;
lei.Properties["ModuleName"] = operatorLogModel.ModuleName;
lei.Properties["ProcName"] = operatorLogModel.ProcName;
lei.Properties["OperationType"] = operatorLogModel.OperationType;
lei.Properties["Logger"] = operatorLogModel.Logger;
lei.Properties["LogMessage"] = operatorLogModel.LogMessage;
lei.Properties["IP"] = operatorLogModel.IP ?? DefaultIP;
lei.Properties["Longdate"] = operatorLogModel.Longdate;
lei.Properties["UserName"] = operatorLogModel.UserName ?? DefaultUser;
lei.Properties["Createdate"] = operatorLogModel.Createdate;
lei.Level = operatorLogModel.LogLevel;
_logger.Log(level, lei);
}
#endregion
}

Logger

对操作类型进行简单封装,也可以自定义:

 /// <summary>
/// 操作类型枚举
/// </summary>
public enum OperationType
{
/// <summary>
/// 保存或添加
/// </summary>
[System.ComponentModel.Description("添加")]
ADD,
/// <summary>
/// 更新
/// </summary>
[System.ComponentModel.Description("更新")]
UPDATE,
/// <summary>
/// 核销
/// </summary>
[System.ComponentModel.Description("核销")]
AUDIT,
/// <summary>
/// 查看
/// </summary>
[System.ComponentModel.Description("指派")]
ASSIGN,
/// <summary>
/// 删除
/// </summary>
[System.ComponentModel.Description("删除")]
DELETE,
/// <summary>
/// 读取/查询
/// </summary>
[System.ComponentModel.Description("查询")]
RETRIEVE,
/// <summary>
/// 登录
/// </summary>
[System.ComponentModel.Description("登录")]
LOGIN,
/// <summary>
/// 查看
/// </summary>
[System.ComponentModel.Description("查看")]
LOOK
}

OperationType

自定义类,主要用于绑定数据:

 /// <summary>
/// 操作日志类
/// </summary>
public class OperatorLogModel
{
/// <summary>
/// 自增主键ID
/// </summary>
public string Id { get; set; }
/// <summary>
/// 一级菜单
/// </summary>
public string AppName { get; set; }
/// <summary>
/// 二级菜单
/// </summary>
public string ModuleName { get; set; }
/// <summary>
/// 本级菜单
/// </summary>
public string ProcName { get; set; }
/// <summary>
/// 操作类型
/// </summary>
public int OperationType { get; set; }
/// <summary>
/// 日志文件
/// </summary>
public string Logger { get; set; }
/// <summary>
/// 日志信息
/// </summary>
public string LogMessage { get; set; }
/// <summary>
/// IP地址
/// </summary>
public string IP { get; set; }
/// <summary>
/// 记录时间
/// </summary>
public string Longdate { get; set; }
/// <summary>
/// 用户名称
/// </summary>
public string UserName { get; set; }
/// <summary>
/// 日志级别
/// </summary>
public NLog.LogLevel LogLevel { get; set; }
/// <summary>
/// 创建时间
/// </summary>
public DateTime Createdate { get; set; }
}

OperatorLogModel

创建数据库表,字段可以自定义,此处用的是SQL Server:

 CREATE TABLE [dbo].[OperatorLog](
[Id] [varchar](60) NOT NULL,
[AppName] [varchar](20) NOT NULL,
[ModuleName] [varchar](30) NOT NULL,
[ProcName] [varchar](30) NOT NULL,
[OperationType] [int] NOT NULL,
[Logger] [varchar](500) NOT NULL,
[LogMessage] [varchar](3000) NOT NULL,
[IP] [varchar](32) NOT NULL,
[UserName] [varchar](36) NOT NULL,
[Createdate] [datetime] NOT NULL,
[LogLevel] [varchar](12) NOT NULL,
CONSTRAINT [PK_OperatorLog] PRIMARY KEY CLUSTERED
(
[Id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY] GO SET ANSI_PADDING OFF
GO ALTER TABLE [dbo].[OperatorLog] ADD CONSTRAINT [DF_OperatorLog_Id] DEFAULT ('') FOR [Id]
GO ALTER TABLE [dbo].[OperatorLog] ADD CONSTRAINT [DF_OperatorLog_AppName] DEFAULT ('') FOR [AppName]
GO ALTER TABLE [dbo].[OperatorLog] ADD CONSTRAINT [DF_OperatorLog_ModuleName] DEFAULT ('') FOR [ModuleName]
GO ALTER TABLE [dbo].[OperatorLog] ADD CONSTRAINT [DF_OperatorLog_ProcName] DEFAULT ('') FOR [ProcName]
GO ALTER TABLE [dbo].[OperatorLog] ADD CONSTRAINT [DF_OperatorLog_OperationType] DEFAULT ((0)) FOR [OperationType]
GO ALTER TABLE [dbo].[OperatorLog] ADD CONSTRAINT [DF_OperatorLog_Logger] DEFAULT ('') FOR [Logger]
GO ALTER TABLE [dbo].[OperatorLog] ADD CONSTRAINT [DF_OperatorLog_LogMessage] DEFAULT ('') FOR [LogMessage]
GO ALTER TABLE [dbo].[OperatorLog] ADD CONSTRAINT [DF_OperatorLog_IP] DEFAULT ('') FOR [IP]
GO ALTER TABLE [dbo].[OperatorLog] ADD CONSTRAINT [DF_OperatorLog_UserName] DEFAULT ('') FOR [UserName]
GO ALTER TABLE [dbo].[OperatorLog] ADD CONSTRAINT [DF__OperatorL__creat__02084FDA] DEFAULT (getdate()) FOR [Createdate]
GO ALTER TABLE [dbo].[OperatorLog] ADD CONSTRAINT [DF_OperatorLog_LogLevel] DEFAULT ('') FOR [LogLevel]
GO EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'日志表主键ID' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'OperatorLog', @level2type=N'COLUMN',@level2name=N'Id'
GO EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'一级菜单' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'OperatorLog', @level2type=N'COLUMN',@level2name=N'AppName'
GO EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'二级菜单' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'OperatorLog', @level2type=N'COLUMN',@level2name=N'ModuleName'
GO EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'本级菜单' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'OperatorLog', @level2type=N'COLUMN',@level2name=N'ProcName'
GO EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'操作类型' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'OperatorLog', @level2type=N'COLUMN',@level2name=N'OperationType'
GO EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'日志文件' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'OperatorLog', @level2type=N'COLUMN',@level2name=N'Logger'
GO EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'日志内容' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'OperatorLog', @level2type=N'COLUMN',@level2name=N'LogMessage'
GO EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'IP地址' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'OperatorLog', @level2type=N'COLUMN',@level2name=N'IP'
GO EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'用户名' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'OperatorLog', @level2type=N'COLUMN',@level2name=N'UserName'
GO EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'创建时间' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'OperatorLog', @level2type=N'COLUMN',@level2name=N'Createdate'
GO EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'日志级别' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'OperatorLog', @level2type=N'COLUMN',@level2name=N'LogLevel'
GO

[dbo].[OperatorLog]

引用日志如下:

  public class Program
{
public static void Main(string[] args)
{
OperatorLogModel opModel = new OperatorLogModel();
opModel.AppName = "系统管理";
opModel.ModuleName = "权限管理";
opModel.ProcName = "用户管理";
opModel.OperationType = Convert.ToInt32(Enum.Parse(typeof(OperationType), OperationType.RETRIEVE.ToString()));
opModel.UserName = "ss";
//opModel.LogLevel = NLog.LogLevel.Trace;
opModel.Longdate = DateTime.Now.ToString();
opModel.Createdate = DateTime.Now;
opModel.Logger = "dfdfd";
opModel.LogMessage = "测试测试测试!!!";
Logger.Default.Error("dsfsfsfd");
//string ip = Request.HttpContext.Connection.RemoteIpAddress.ToString(); //Logger.Default.Info("就是这么霸气"); Logger.Default.InsOperatorLog(opModel);
CreateWebHostBuilder(args).Build().Run();
} public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
WebHost.CreateDefaultBuilder(args)
.UseStartup<Startup>();
}

Program

数据库插入的操作日志结果如下:

文件中记录的日志如下:

以上就是NLog日志组件的简单封装,欢迎纠错!!!

NLog组件的更多相关文章

  1. 开源分布式Job系统,调度与业务分离-HttpJob.Agent组件介绍以及如何使用

    项目介绍: Hangfire:是一个开源的job调度系统,支持分布式JOB!! Hangfire.HttpJob 是我针对Hangfire开发的一个组件,该组件和Hangfire本身是独立的.可以独立 ...

  2. NLog记录日志到本地或数据库

    OperatorLog CREATE TABLE [dbo].[OperatorLog]( ,) NOT NULL, [Createdate] [DATETIME] NOT NULL DEFAULT ...

  3. 使用NLog把日志写入数据库并按天自动分表

    前言 最近用Asp.net Core开发程序的时候 因为时间的关系,就没有过多的去关注日志方面的功能 都是直接用系统的ILogger先记录着,然后看日志的时候就先在命令行看日志 在开发阶段没有什么问题 ...

  4. Log4net使用(一)

    LogHelper.cs using NLog; using NLog.Targets; namespace MyProject.Tool.Log { public class LogHelper { ...

  5. ASP.NET CORE小试牛刀:干货(完整源码)

    扯淡 .NET Core 的推出让开发者欣喜万分,从封闭到拥抱开源十分振奋人心.对跨平台的支持,也让咱.NET开发者体验了一把 Write once,run any where 的感觉!近期离职后,时 ...

  6. 迎元旦,庆surging 1.0发布

    一位摄影程序员的独白 每个人都有爱好,都有释放压力的活动,而我也不例外,我除了每天上班,周末就会约一群好友去拍妹子,成家后,就改为拍虫子,一拍就到了30岁,到了30岁就感觉到了中年的压力,这时候停下手 ...

  7. Asp.NetCore依赖注入和管道方式的异常处理及日志记录

    前言     在业务系统,异常处理是所有开发人员必须面对的问题,在一定程度上,异常处理的能力反映出开发者对业务的驾驭水平:本章将着重介绍如何在 WebApi 程序中对异常进行捕获,然后利用 Nlog ...

  8. net core体系-web应用程序-4asp.net core2.0 项目实战(1)-2项目说明和源码下载

    本文目录1. 摘要2. Window下运行 3.linux下运行4. 开发记录5. 总结 1.概要 写<Asp.Net Core 2.0 项目实战>系列断断续续已经很长时间了,期间很多朋友 ...

  9. Asp.Net Core 2.0 项目实战(1) NCMVC开源下载了

    Asp.Net Core 2.0 项目实战(1) NCMVC开源下载了 Asp.Net Core 2.0 项目实战(2)NCMVC一个基于Net Core2.0搭建的角色权限管理开发框架 Asp.Ne ...

随机推荐

  1. TensorFlow之DNN(二):全连接神经网络的加速技巧(Xavier初始化、Adam、Batch Norm、学习率衰减与梯度截断)

    在上一篇博客<TensorFlow之DNN(一):构建“裸机版”全连接神经网络>中,我整理了一个用TensorFlow实现的简单全连接神经网络模型,没有运用加速技巧(小批量梯度下降不算哦) ...

  2. 将本地文件传输到GitHub

    统一概念: 工作区:增删文件和内容 暂存区:键入命令 git add 改动的文件,此次改动就放到了 『暂存区』 本地仓库 :键入命令 git commit ,此次改动就放到了『本地仓库』,每个 com ...

  3. python接口自动化(十九)--Json 数据处理---实战(详解)

    简介 上一篇说了关于json数据处理,是为了断言方便,这篇就带各位小伙伴实战一下.首先捋一下思路,然后根据思路一步一步的去实现和实战,不要一开始就盲目的动手和无头苍蝇一样到处乱撞,撞得头破血流后而放弃 ...

  4. Python:轻量级 ORM 框架 peewee 用法详解(二)——增删改查

    说明:peewee 中有很多方法是延时执行的,需要调用 execute() 方法使其执行.下文中不再特意说明这个问题,大家看代码. 本文中代码样例所使用的 Person 模型如下: class Per ...

  5. 4.JAVA-数组、String详解

    1.数组 public class Test{ public static void main(String args[]){ int[] intArray = new int[] {1,4,3,2, ...

  6. Java设计模式小议之1------- 迭代器模式

    定义:提供一种方法访问一个容器对象中各个元素,而又不暴露该对象的内部细节. 类型:行为类模式 这里用一个具体的案例来说明一下迭代器模式的简单使用 我们都知道在商店中,经常要把商品放到书架上,并将商品的 ...

  7. 如何让div中的table水平居中

    <div style="text-align:center"> <table border="1" cellpadding="3&q ...

  8. Process 'command 'D:\jdk8\jdk\bin\java.exe'' finished with non-zero exit value 2

    转载请标明出处,维权必究:https://www.cnblogs.com/tangZH/p/10539006.html 捣鼓了好久,现在已经不想说话,为何会出现这个问题,Process 'comman ...

  9. mapbox.gl源码解析——基本架构与数据渲染流程

    加载地图 Mapbox GL JS是一个JavaScript库,使用WebGL渲染交互式矢量瓦片地图和栅格瓦片地图.WebGL渲染意味着高性能,MapboxGL能够渲染大量的地图要素,拥有流畅的交互以 ...

  10. Python中的音频和数字信号处理(DSP)

    翻译自Python For Engineers. 1. 创建一个正弦波 在这个项目中,我们将创建一个正弦波,并将其保存为wav文件. 但在此之前,你应该知道一些理论. 频率:频率是正弦波重复一秒的次数 ...