接触.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. 死磕 java集合之DelayQueue源码分析

    问题 (1)DelayQueue是阻塞队列吗? (2)DelayQueue的实现方式? (3)DelayQueue主要用于什么场景? 简介 DelayQueue是java并发包下的延时阻塞队列,常用于 ...

  2. 你真的了解ASP.NET Core 部署模型吗?

    ----------------------------   以下内容针对 ASP.NET Core2.1,2.2出现IIS进程内寄宿 暂不展开讨论-------------------------- ...

  3. mysql数据库NO CONNECTION问题分析以及解决方案

    自己的站点有时候会挂掉,着实比较麻烦,我不会24小时都看着,说多的都是泪 出现mysql出现NO CONNECTION 有可能原因:mysql服务出现问题 解决方案:重启mysql服务,数据库就连接上 ...

  4. Hadoop大数据部署

    Hadoop大数据部署 一. 系统环境配置: 1. 关闭防火墙,selinux 关闭防火墙: systemctl stop firewalld systemctl disable firewalld ...

  5. java游戏开发杂谈 - 实现游戏主菜单

    经常玩游戏的同学,大家都知道,游戏都会有个主菜单,里面有多个菜单选项:开始游戏.游戏设置.关于游戏.退出游戏等等,这个菜单是怎么实现的呢. 有一定桌面软件开发基础的同学可能会想到,用JButton组件 ...

  6. Asp.Net Core Web应用程序—探索

    前言 作为一个Windows系统下的开发者,我对于Core的使用机会几乎为0,但是考虑到微软的战略规划,我觉得,Core还是有先了解起来的必要. 因为,目前微软已经搞出了两个框架了,一个是Net标准( ...

  7. Nginx的“远方表哥”—Tengine

    本文收录在Linux运维企业架构实战系列 今天想起当初研究nginx反向代理负载均衡时,nginx自身的upstream后端配置用着非常不舒服: 当时使用的淘宝基于nginx二次开发的Tengine, ...

  8. Cookie、LocalStorage 与 SessionStorage的区别在哪里?

    基本概念 Cookie Cookie 是小甜饼的意思.顾名思义,cookie 确实非常小,它的大小限制为4KB左右.它的主要用途有保存登录信息,比如你登录某个网站市场可以看到“记住密码”,这通常就是通 ...

  9. [转]webstorm中js文件被识别成txt类型

    问题描述: webstorm中index.js文件被识别成txt格式,如下图. 原因: webstorm中js文件被识别成txt文件,原因在于txt类型识别了以当前js文件名命名的模式. 解决办法: ...

  10. Mapbox使用详解

    一.简介: Mapbox致力于打造全球最漂亮的个性化地图.   在一次偶然的地图相关资料搜索过程中发现了一个很神奇又很漂亮的地图,这个地图支持高度自定义各种地图元素,比如,道路,水系,绿地,建筑物,背 ...