当前位置: 首页 > news >正文

ASP.NET MVC会计教学管理端项目系列--Log4Net日志组件

02: ASP.NET MVC会计教学管理端项目系列–三层+MVVM搭建

03: ASP.NET MVC会计教学管理端项目系列–autofac批量注入

文章目录

  • Log4Net
    • logger节点配置详解
    • 日志级别等级
    • ILog对象说明
    • 简单使用
    • 自定义配置扩展
    • ES 扩展

Log4Net

log4net库是Apache log4j框架在Microsoft .NET平台的实现,是一个帮助程序员将日志信息输出到各种目标(控制台、文件、数据库等)的工具

logger节点配置详解

logger节点支持的属性:name、additivity。

name 必须的,logger的名称,在代码中得到ILog对象时用到。
additivity 可选,取值是true或false,默认值是true。设置为false时将阻止父logger中的appender。

logger支持的子元素:level、appender-ref、param。

level 最多一个。在这个级别或之上的才会被记录。OFF、FATAL、ERROR、WARN 、INFO、DEBUG、ALL

appender-ref 0个或多个,要引用的appender的名字。

param 0个或多个,设置一些参数。

日志级别等级

高到底分别为:OFF > FATAL > ERROR > WARN > INFO > DEBUG > ALL

ILog对象说明

ILog是实现Logger的一个接口,ILog定义了5个方法(Debug,Inof,Warn,Error,Fatal)分别对不同的日志等级记录日志。这5个方法都有1个重载,以Debug为例说明一下,其它的和它差不多。

ILog中对Debug方法的定义如下:

void Debug(object message);
void Debug(object message, Exception exception);

还有一个布尔属性:

bool IsDebugEnabled { get; }

如果使用Debug(object message, Exception exception)则无论Layout如何配置,日志都会输出Exception信息,包括Exception的Message和Trace。如果使用Debug(object message),则无论Layout如何配置是不会输出Exception信息的。

在代码中可以使用LogManager类来得到Logger配置下的相应的ILog对象,LogManager类用来管理所应得Logger,它的GetLogger静态方法,可以获得配置文件中相应的Logger,代码如下:

 ILog log = LogManager.GetLogger("logger-name")

简单使用

1、在web站点中的Web.config中根节点 configuration添加如下配置

<!--此处是log4net的配置-->
  <log4net>
    <!--错误日志类-->
    <logger name="logerror">
      <!--日志类的名字-->
      <level value="ALL" />
      <!--定义记录的日志级别-->
      <appender-ref ref="ErrorAppender" />
      <!--记录到哪个介质中去-->
    </logger>
    <root>
      <level value="WARN" />
      <appender-ref ref="LogFileAppender" />
      <appender-ref ref="ConsoleAppender" />
    </root>
    <!--异常日志→name的值要对应你LogHelper的log4net.LogManager.GetLogger("logerror");不区分大小写-->
    <logger name="LogError">
      <level value="ALL" />
      <appender-ref ref="InfoAppender" />
    </logger>
    <appender name="ErrorAppender" type="log4net.Appender.RollingFileAppender">
      <!-- name属性指定其名称,type则是log4net.Appender命名空间的一个类的名称,意思是,指定使用哪种介质-->
      <param name="File" value="App_Data\\LogError\\" />
      <!--日志输出到exe程序这个相对目录下-->
      <param name="AppendToFile" value="true" />
      <!--输出的日志不会覆盖以前的信息-->
      <param name="MaxSizeRollBackups" value="100" />
      <!--备份文件的个数-->
      <param name="MaxFileSize" value="10240" />
      <!--当个日志文件的最大大小-->
      <param name="StaticLogFileName" value="false" />
      <!--是否使用静态文件名-->
      <param name="DatePattern" value="yyyyMMdd&quot;.txt&quot;" />
      <!--日志文件名-->
      <param name="RollingStyle" value="Date" />
      <!--文件创建的方式,这里是以Date方式创建-->
      <!--错误日志布局-->
      <layout type="log4net.Layout.PatternLayout">
        <param name="ConversionPattern" value="&lt;HR COLOR=red&gt;%n异常时间:%d [%t] &lt;BR&gt;%n异常级别:%-5p &lt;BR&gt;%n异 常 类:%c [%x] &lt;BR&gt;%n%m &lt;BR&gt;%n &lt;HR Size=1&gt;" />
      </layout>
    </appender>
    <appender name="ConsoleAppender" type="log4net.Appender.ConsoleAppender">
      <layout type="log4net.Layout.PatternLayout">
        <param name="ConversionPattern" value="%d [%t] %-5p %c [%x] - %m%n" />
      </layout>
    </appender>
  </log4net>

2、Web站点安装Nuget包
在这里插入图片描述
3、在Global.asax中Application_Start方法添加如下代码:

log4net.Config.XmlConfigurator.Configure();

在这里插入图片描述
4、新建基础类库同样安装log4net包,添加日志记录帮助类:

    public class LogHelper
    {
        public static readonly log4net.ILog loginfo = log4net.LogManager.GetLogger("loginfo");
        public static readonly log4net.ILog logerror = log4net.LogManager.GetLogger("logerror");

        /// <summary>
        /// 操作日志
        /// </summary>
        /// <param name="info"></param>
        public static void Info(string info)
        {
            if (loginfo.IsInfoEnabled)
            {
                loginfo.Info(info);
            }
        }

        /// <summary>
        /// 错误日志
        /// </summary>
        /// <param name="info"></param>
        /// <param name="ex"></param>
        public static void Error(string info, Exception ex)
        {
            if (logerror.IsErrorEnabled)
            {
                logerror.Error(info, ex);
            }
        }

        /// <summary>
        /// 警告日志
        /// </summary>
        /// <param name="info"></param>
        /// <param name="ex"></param>
        public static void Warn(string info, Exception ex)
        {
            if (logerror.IsWarnEnabled)
            {
                logerror.Warn(info, ex);
            }
        }

        /// <summary>
        /// 调试日志
        /// </summary>
        /// <param name="info"></param>
        /// <param name="ex"></param>
        public static void Debug(string info, Exception ex)
        {
            if (logerror.IsDebugEnabled)
            {
                logerror.Debug(info, ex);
            }
        }
    }

自定义配置扩展

1、WebConfig 中添加默认日志路径:

<!--默认文本日志路径-->
<add key="TxtLogPath" value="D:\Log\\"/>
<!--自定义日志文件路径,如果没配置走文本日志路径-->
<add key="Log4NetConfigPath" value="D:\\Log4Net.Config"/>

2、自定义扩展并支持日志分卷

 /// <summary>
 /// Log4文件上限分卷日志组件
 /// </summary>
 public static class Logger
 {
     //是否使用组件默认配置
     public static bool IsDefaultConfig;
     static Logger()
     {
         try
         {
             var log4NetConfigPath = ConfigManager.AppSetting("Log4NetConfigPath"); 
             if (log4NetConfigPath == null)
             {
                 IsDefaultConfig = true;
                 return;
             }
             XmlConfigurator.Configure(new System.IO.FileInfo(log4NetConfigPath));
         }
         catch
         {
             IsDefaultConfig = true;
         }
     }
     #region 日志静态实现方法,不可被重写

     /// <summary>
     /// 提示信息
     /// </summary>
     /// <param name="logPath">日志记录的自定义路径(D://Log//),如果是业务路径,则自动忽略</param>
     /// <param name="msg"></param>
     /// <param name="isDefaultlogPath"></param>
     public static void Info(string msg, string logPath = "", bool isDefaultlogPath = true)
     {
         logPath = GetLogPath(isDefaultlogPath, logPath);
         Logging.LogInfo(logPath, msg);
     }

     /// <summary>
     /// 告警信息
     /// </summary>
     /// <param name="logPath">日志记录的自定义路径(D://Log//),如果是业务路径,则自动忽略</param>
     /// <param name="msg"></param>
     /// <param name="isDefaultlogPath"></param>
     public static void Warn(string msg, string logPath = "", bool isDefaultlogPath = true)
     {
         logPath = GetLogPath(isDefaultlogPath, logPath);
         Logging.LogInfo(logPath, msg);
     }

     /// <summary>
     /// 记录错误日志
     /// </summary>
     /// <param name="logPath">日志记录的自定义路径(D://Log//),如果是业务路径,则自动忽略</param>
     /// <param name="msg"></param>
     /// <param name="ex"></param>
     /// <param name="isDefaultlogPath"></param>
     public static void Error(string msg, Exception ex = null, string logPath = "", bool isDefaultlogPath = true)
     {
         logPath = GetLogPath(isDefaultlogPath, logPath);
         Logging.LogError(logPath, msg, ex);
     }


     private static string GetLogPath(bool isDefaultlogPath, string logPath = "")
     {
         try
         {
             //如果不是默认路径,则根据跟目录获取相关域名
             if (!isDefaultlogPath || !IsDefaultConfig)
             {
                 return logPath;
             }
             logPath = ConfigManager.AppSetting("TxtLogPath");
             if (logPath == null)
             {
                 throw new Exception($"初始化日志配置文件出错,请检查【TxtLogPath】是否配置,且路径完全正确");
             }
             return logPath;
         }
         catch (Exception ex)
         {
             throw new Exception($"初始化日志配置文件出错,请检查【TxtLogPath】是否配置,且路径完全正确,异常信息:{ex}");
         }
     }
     #endregion
 }

ES 扩展

【本次项目暂不使用ES,这里只做示范】

1、安装包log4stash,log4stash是日志记录es的一个组件
在这里插入图片描述
2、配置es

<!--ES日志管理,本次项目暂不使用ES-->
<add key="ElasticSearchService" value="10.1.21.1|9200|eadminlog"/>

3、调用

/// <summary>
/// 日志记录工具类
/// </summary>
public static class Logging
{
   private static readonly object MLock = new object();
   private const string Maxfilesize = "LogMaxFileSize";
   private const string Maxsizerollbackups = "LogMaxSizeRollBackups";
   public static string[] Configs;
   public static ConcurrentDictionary<string, object> Dic = new ConcurrentDictionary<string, object>();

   static Logging()
   {
       BasicConfigurator.Configure();
       var elasticSearch = ConfigManager.AppSetting("ElasticSearchService"); 
       if (elasticSearch == null)
       {
           return;
       }
       Configs = elasticSearch.Split(new char[] { '|' }, StringSplitOptions.RemoveEmptyEntries);
       if (Configs.Length != 3)
       {
           throw new Exception($"初始化日志配置文件出错,请检查【ElasticSearchService】是否配置,正确格式如下:10.1.21.1|9200|efinancelog");
       }
   }

   #region Info

   /// <summary>
   /// 日志目录地址(绝对路径)
   /// </summary>
   /// <param name="logpath"></param>
   /// <param name="info"></param>
   public static void LogInfo(string logpath, string info)
   {
       var logFile = GetLog("loginfo", logpath);
       if (!logFile.IsInfoEnabled) return;
       logFile.Info(info);
   }

   #endregion

   #region error

   /// <summary>
   /// A private method that really do the work of logging
   /// </summary>
   /// <param name="message"></param>
   /// <param name="ex"></param>
   /// <param name="logPath"></param>
   public static void LogError(string logPath, string message, Exception ex)
   {
       var logFile = GetLog("logerror", logPath);
       if (!logFile.IsErrorEnabled) return;
       logFile.Error(message, ex);
   }

   #endregion

   #region commom

   public static ILog GetLog(string name, string logpath = "")
   {
       try
       {
           var log = LogManager.GetLogger(name);

           if (((log4net.Repository.Hierarchy.Logger)log.Logger).GetAppender(name) != null) return log;
           lock (MLock)
           {
               ((log4net.Repository.Hierarchy.Logger)log.Logger).AddAppender(new NRollingFileAppender(logpath, name));
               if (Configs?.Length == 3)
               {
                   ((log4net.Repository.Hierarchy.Logger)log.Logger).AddAppender(new NElasticSearchAppender("ElasticSearch"));
               }
           }
           return log;
       }
       catch
       {
           return LogManager.GetLogger("logFile");
       }

   }
   internal static bool IsPhysicsPath(string path)
   {
       var regex = new Regex(@"^([a-zA-Z]:\\)?[^\/\:\*\?\""\<\>\|\,]*$");
       return regex.IsMatch(path);
   }
   #endregion

   #region config

   /// <summary>
   /// 构建日志RollingFileAppender
   /// </summary>
   private sealed class NRollingFileAppender : RollingFileAppender
   {
       public NRollingFileAppender(string logPath, string logName)
       {
           File = Path.Combine(logPath, $"{logName}\\");
           Name = logName;
           Layout = new PatternLayout("%n记录时间:%date 线程ID:[%thread] 日志级别:%-5level  %n日志描述:%message %n");
           ImmediateFlush = true;
           MaxFileSize = GetMaxFileSize();
           DatePattern = "yyyy-MM-dd-HH.'txt'";
           MaxSizeRollBackups = GetMaxSizeRollBackups();
           RollingStyle = RollingMode.Composite;
           AppendToFile = true;
           StaticLogFileName = false;
           LockingModel = new MinimalLock();
           base.ActivateOptions();
       }

       /// <summary>
       /// 当日志文件达到MaxFileSize大小,就自动创建备份文件。备份文件的多少由MaxSizeRollBackups决定
       /// </summary>
       /// <returns></returns>
       private static int GetMaxSizeRollBackups()
       {
           var config = ConfigManager.AppSetting(Maxsizerollbackups);

           if (string.IsNullOrEmpty(config))
               config = "-1";
           int i;
           int.TryParse(config, out i);

           return i != 0 ? i : -1;

       }

       /// <summary>
       /// 获取每个日志文件最大容量
       /// </summary>
       /// <returns></returns>
       private static long GetMaxFileSize()
       {
           var config = ConfigManager.AppSetting(Maxfilesize); 
           double rate = 1024;
           string unit = "m";

           if (string.IsNullOrEmpty(config))
               config = "20M";

           config = config.ToLower();

           if (config.EndsWith("m"))
           {
               rate = Math.Pow(rate, 2);
           }
           else if (config.EndsWith("g"))
           {
               rate = Math.Pow(rate, 3);
               unit = "g";
           }

           int i = config.IndexOf(unit, StringComparison.Ordinal);
           int quota = 0;

           if (i > 0)
           {
               var data = config.Substring(0, i);
               int.TryParse(data, out quota);
           }

           quota = quota == 0 ? 20 : quota;

           return (long)(quota * rate);
       }
   }

   private sealed class NElasticSearchAppender : ElasticSearchAppender
   {
       public NElasticSearchAppender(string logName)
       {
           Server = Configs[0];
           Port = Convert.ToInt32(Configs[1]);
           IndexName = $"{Configs[2]}_{DateTime.Now.ToString("yyyy-MM-dd")}";
           IndexType = "LogEvent";
           Name = logName;
           Layout = new PatternLayout("%n记录时间:%date 线程ID:[%thread] 日志级别:%-5level  %n日志描述:%message %n");
           base.ActivateOptions();
       }

   }


   private sealed class SmtpAppenderAppender : SmtpAppender
   {
       public SmtpAppenderAppender(string logName)
       {
           Authentication=SmtpAuthentication.Basic;
           Port = Convert.ToInt32(Configs[1]);
           Name = logName;
           Layout = new PatternLayout("%n记录时间:%date 线程ID:[%thread] 日志级别:%-5level  %n日志描述:%message %n");
           base.ActivateOptions();
       }

   }
   #endregion
}

相关文章:

Day 58 shell脚本命令

1.概念&#xff1a; Shell是linux中一个重要的层次&#xff0c;它是用户与系统交互作用的界面。在介绍linux命令时&#xff0c;shell都作为命令解释程序出现&#xff1a;它接收用户打入的命令&#xff0c;进行分析&#xff0c;创建子进程实现命令所规定的功能&#xff0c;等子进…...

CodeForces - 450C Jzzhu and Chocolate 数学 贪心

Jzzhu has a big rectangular chocolate bar that consists of n  m unit squares. He wants to cut this bar exactly k times. Each cut must meet the following requirements: each cut should be straight (horizontal or vertical);each cut should go along edges of…...

QT 编译zlib

博主环境&#xff1a;QT 5.9.1 VS2105 从zlib官网下载zlib源代码&#xff0c;官网链接&#xff1a;https://www.zlib.net/&#xff0c;根据自己的需求进行下载&#xff0c;博主下载的是zip格式的。 下载完成后&#xff0c;进行解压。打开Developer Command Prompt for VS2015…...

PCL Super4PCS算法实现点云粗配准(版本二)

目录 一、算法概述参数解析二、代码实现三、结果展示四、编译好的库一、算法概述 Win10系统下实现Super4PCS: Fast Global Pointcloud Registration via Smart Indexing一文中的配准算法。与版本一实现方式不同的是:这里直接将OpenGR集成到PCL中,目前网上也有很多相关的实现代…...

括号有效配对题型问题解法

目录 问题描述&#xff1a; 问题一&#xff1a;怎么判断一个括号字符串有效&#xff1f; 问题二&#xff1a;如果一个括号字符串无效&#xff0c;返回至少填几个字符能让其整体有效。 问题三&#xff1a;返回一个括号字符串中&#xff0c;最长的括号有效子串的长度。 问题四…...

应该记住的10个SQL 查询

注意&#xff1a;所有查询都是用PostgreSQL编写的。 文章目录选择所有行where 语句Group by and Have 子句Order By and Limit日期函数内连接、左连接或右连接子查询相关子查询Case When 子句窗口函数对值进行排序选择所有行 SELECT * FROM employees如下&#xff1a; where…...

双十一3000元投影仪评测排名,性价比最高的投影仪是什么品牌

今年的双十一各位都付尾款了吗&#xff1f;作为一年一度的大型电商节活动相信每个人都有参与&#xff0c;尤其是家用产品买的人应该会很多&#xff0c;就比如投影仪&#xff0c;能够代替电视使用&#xff0c;还能呈现出百寸以上的画面&#xff0c;视觉感觉俱佳。可以说3000元左…...

css--内外边距、 盒子模型、位置、浮动

一、内外边距 1.margin 1.1属性为给定元素设置所有四个&#xff08;上下左右&#xff09;方向的外边距属性。 上下左右具有四个方向:margin-top、margin-right、margin-bottom、margin-left可取值&#xff1a;length&#xff1a;固定值 percentage&#xff1a;相对于包…...

自动化早已不是那个自动化了,谈一谈自动化测试现状和自我感受……

前言 从2017年6月开始接触自动化至今&#xff0c;已经有好几年了&#xff0c;从17年接触UI自动化&#xff08;unittestselenium&#xff09;到18年接触接口自动化&#xff08;unittestrequests&#xff09;再到18年自己编写自动化平台&#xff08;后台使用python的flask&#…...

flex blaze+java通信的例子

步骤&#xff1a; 1&#xff1a;建立java web程序 2&#xff1a; 下载blazeDS包&#xff0c;解压后将WEB-INF下的 flex&#xff0c;lib&#xff0c;web.xml复制到java程序的WEB-INF下 3&#xff1a;打开web.xml文件将以下代码的注释去掉&#xff0c;并修改 <param-value>…...

生产工艺审批管理系统java项目开发jsp编程软件myeclipse开发Mysql数据库计算机网页

一、源码特点 JSP 生产工艺审批管理系统 是一套完善的web设计系统&#xff0c;对理解JSP java编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发。开发环境为 TOMCAT7.0,Myeclipse8.5开发&#xff0c;数据库为Mysql&#xff0…...

actionScript 数组去重

public function unique(array:Array):Array { for (var i:int0; i < array.length; i) { for (var j:inti 1; j < array.length; j) { //注意 if (array[i] array[j]) { array.splice(j, 1); j--; } } } return array…...

【C++音视频开发】初级篇 | RGB与YUV

前言 本专栏将不间断更新有关C音视频开发的内容&#xff0c;其中有初级篇、中级篇与高级篇的内容&#xff0c;包括但不限于音视频基础、FFmpeg实战、QT、流媒体客户端、流媒体服务器、WebRTC实战、Android NDK等等。是博主花了将近5000元购买的课程中的知识点&#xff0c;其中…...

Java反射04:获取运行时类的属性结构及其内部结构

文章目录获取运行时类的属性结构及其内部结构新建测试类1.获取每一个Field&#xff08;属性&#xff09;2.获取运行时类的方法结构3.获取运行时类的构造器4.获取当前运行时所继承的父类和接口5.获取当前运行时类的注解、包、泛型获取运行时类的属性结构及其内部结构 通过反射获…...

qsettings 读写注册表

qsettings简单的实现一个注册表读写操作&#xff0c;记录程序中需要保存的信息。使用qsettings声明对象之前&#xff0c;需要指明qsettings的组织名和应用名&#xff0c;分别利用QCoreApplication::setOrganizationName()和QCoreApplication::setApplicationName()来指定组织名…...

【JavaScript高级进阶】构造函数和原型,学会prototype

目录 前言 1.构造函数和原型 1.1使用prototype解决内存浪费的问题 1.2constructor构造函数构造器构造函数 2.原型链 2.1js中成员查找规则 2.2原型对象this指向 2.3扩展内置对象 3.call作用 4.继承 4.1利用原型对象继承 写在最后 前言 哈喽哈喽大家好&#xff0c;因为…...

【学生个人网页设计作品】使用HMTL制作一个超好看的保护海豚动物网页

&#x1f389;精彩专栏推荐 &#x1f4ad;文末获取联系 ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 &#x1f482; 作者主页: 【主页——&#x1f680;获取更多优质源码】 &#x1f393; web前端期末大作业&#xff1a; 【&#x1f4da;毕设项目精品实战案例 (10…...

CodeForces - 545E Paths and Trees 最短路建树

题目链接&#xff1a;点击查看 Little girl Susie accidentally found her elder brothers notebook. She has many things to do, more important than solving problems, but she found this problem too interesting, so she wanted to know its solution and decided to a…...

【工具使用】Visual Studio Code远程调试

VS Code的其中一个关键的特征就是它极好的调试支持。VS Code的内置调试器帮助加速你的编辑、编译和调试循环。 调试扩展 VS Code有Node.js运行的内置的调试支持&#xff0c;并且能够调试Java脚本或者任何其他可以转译为JavaScript的语言。为了调试其他语言&#xff08;包括P…...

ADB学习笔记

简介&#xff1a; ADB的全称为Android Debug Bridge&#xff08;调试桥&#xff09;&#xff0c; 它是一个客户端-服务器端程序&#xff0c;其中客户端是你用来操作的电脑, 服务器端是android设备。作用显而易见&#xff0c;能方便我们在PC上对手机进行调试的一些工作。 原理…...

http load介绍

前几天工作中要对项目的接口做简单压测&#xff0c;就使用了http load做了简单测试&#xff0c;下面介绍一下这款工具的使用说明。简介&#xff1a;http_load是基于linux平台的性能测试工具&#xff0c;它体积非常小&#xff0c;仅100KB。它以并行复用的方式运行&#xff0c;可…...

Linux shell脚本之回顾及实用笔记

一、前言 我们从事运维的小伙伴,除了自动化运维外,在没有自动化条件下,借助shell脚本/Python脚本来提升运维效率,无疑是一个必选项,当前也可以自建自动化运维平台,我们这里还是以Linux shell脚本为主,来汇总一些常用的运维脚本,对于有基础的同学,也随本文一起回顾下相…...

TestNG使用总结

TestNG简介&#xff1a; TestNG是一个测试框架&#xff0c;其灵感来自JUnit和NUnit&#xff0c;但同时引入了一些新的功能&#xff0c;使其功能更强大&#xff0c;使用更方便。 TestNG相较于Junit的优点&#xff1a; 可指定执行顺序&#xff0c; dependsOnMethods 属性来应对…...

面向对象编程的弊端

英文原文&#xff1a;What’s Wrong with OOP and FP 我不理解为什么人们会对面向对象编程和函数式编程做无休无止的争论。就好象这类问题已经超越了人类智力极限&#xff0c;所以你可以几个世纪的这样讨论下去。经过这些年对编程语言的研究&#xff0c;我已经清楚的看到了问题…...

flex 计算指定日期是本年度第几周

/** * 计算指定日期是本年度第几周 *传日年月日&#xff0c;返回number */ private function weekOfYear(yyyy:Number,mm:Number,dd:Number):Number{ var myDate:Date new Date(yyyy, mm - 1, dd); var startDate:Date new Date(yyyy,0,1); v…...

SpringCloud Zuul(四)之工作原理

一、筛选器概述 Zuul的中心是一系列过滤器&#xff0c;这些过滤器能够在HTTP请求和响应的路由期间执行一系列操作。 以下是Zuul过滤器的主要特征&#xff1a; 类型&#xff1a;通常定义路由流程中应用过滤器的阶段&#xff08;尽管它可以是任何自定义字符串&#xff09;执行…...

[CSS]圆角边框与阴影

前言 系列文章目录&#xff1a; [目录]HTML CSS JS 根据视频和PPT整理视频及对应资料&#xff1a;HTML CSS 老师笔记&#xff1a; https://gitee.com/xiaoqiang001/html_css_material.git视频&#xff1a;黑马程序员pink老师前端入门教程&#xff0c;零基础必看的h5(html5)css3…...

Google Swift 与 DC 传输

网络拥塞&#xff0c;默认指转发节点出现了严重的排队现象&#xff0c;甚至队列溢出而丢包。、 但接收端也是一个统计复用系统(通用 OS 均为统计复用系统&#xff0c;比如 Linux)&#xff0c;但凡统计复用系统就是潜在拥塞点&#xff0c;即可套用排队论模型。 人们很少将最后…...

webservice学习记录笔记(一)

一、先理解什么是服务 现在的应用程序变得越来越复杂&#xff0c;甚至只靠单一的应用程序无法完成全部的工作。更别说只使用一种语言了。 写应用程序查询数据库时&#xff0c;并没有考虑过为什么可以将查询结果返回给上层的应用程序&#xff0c;甚至认为&#xff0c;这就是数…...

spring Cloud微服务 security+oauth2认证授权中心自定义令牌增强,并实现登录和退出

文章目录认证授权中心自定义令牌增强自定义认证端点返回结果登录逻辑调整&#xff0c;增强令牌返回参数测试验证用户微服务构建配置类构建相关实体类登录退出登录在之前的博客我写了 SpringCloud整合spring security oauth2Redis实现认证授权&#xff0c;本文对返回的token实现…...

接口测试那些事儿

什么是接口&#xff1f; 首先&#xff0c;在讲接口测试之前&#xff0c;我们先要搞清楚接口类型的概念。 接口&#xff1a;可能是系统与系统&#xff08;包括服务与服务&#xff09;之间的调用&#xff0c;像A系统&#xff08;服务&#xff09;给B系统&#xff08;服务&#x…...

CodeForces - 1084C The Fair Nut and String 思维

The Fair Nut found a string s. The string consists of lowercase Latin letters. The Nut is a curious guy, so he wants to find the number of strictly increasing sequences p1,p2,…,pk , such that: For each i (1≤i≤k), spi a.For each i(1≤i<k), there is…...

Gym - 101986B Parallel Lines dfs暴力

链接&#xff1a;点击查看 题意&#xff1a;偶数个点&#xff0c;两点可连成一条线&#xff0c;求平行线最大对数 题解&#xff1a;当时想的时候傻逼了&#xff0c;想成了每次选两个点就是16*15/2 * 14*13/2 ..... 其实不需要这样&#xff0c;因为每个点必须要匹配一个的&…...

POJ - 2406 Power Strings next数组应用循环节

题目链接&#xff1a;点击查看 Language:Default Power Strings Time Limit: 3000MS Memory Limit: 65536KTotal Submissions: 61784 Accepted: 25534Description Given two strings a and b we define a*b to be their concatenation. For example, if a "abc" and…...

CodeForces - 545D Queue 贪心 排序

题目链接&#xff1a;点击查看 Little girl Susie went shopping with her mom and she wondered how to improve service quality. There are n people in the queue. For each person we know time ti needed to serve him. A person will be disappointed if the time he …...

Jmeter访问HTTPS请求

公司最近在搞全站HTTPS改造&#xff0c;进一步提高网站的安全性&#xff0c;防止运营商劫持。那么&#xff0c;改造完成后&#xff0c;所有前后端的URL将全部为https。 So &#xff0c;研究下怎么用Jmeter访问https请求呢。 其实很简单&#xff0c; 第一步在jmeter中创建HTT…...

python导入安装包

主要分两种方式&#xff1a;在线安装和离线安装 在线安装 因为我公司开发是在云桌面&#xff0c;里面是没有外网的。之前是只能离线安装&#xff0c;后面搭了一个内部镜像环境。 1.添加配置文件进行换源 2.检查requirements.txt配置 3.直接使用pycahrm工具install 换源 …...

HDU - 6188 Duizi and Shunzi 贪心

Nike likes playing cards and makes a problem of it. Now give you n integers, ai(1≤i≤n) We define two identical numbers (eg: 2,2) a Duizi, and three consecutive positive integers (eg: 2,3,4) a Shunzi. Now you want to use these integers to form Shunzi and …...

JSON相关知识点

JSON是工作中经常会遇到的一种数据结构&#xff0c;下面来讲讲与他相关的一些知识点。 JSON简介&#xff1a; JSON: JavaScript Object Notation(JavaScript 对象表示法) JSON 是存储和交换文本信息的语法,类似 XML。 JSON 比 XML 更小、更快&#xff0c;更易解析。 JSONObj…...

每天五分钟机器学习:超平面分离定理和凸优化

凸集和凸函数 在点集拓扑学与欧几里得空间中,凸集是一个点集,其中每两点之间的直线上的点都落在该点集中。如下所示: 函数任意两点(x,f(x))和(y,f(y))连线上的值大于(x,y)区间内任意一点m的值f(m),那么这个函数就是一个凸函数: 超平面分离定理 空间中存在两类样本,…...

数据中心典型测试场景浅析

数据中心概述 数据中心泛指拥有众多服务器的大型机房&#xff0c;通过利用通信运营商已有的互联网通信线路、带宽资源&#xff0c;建立标准化的数据中心机房环境&#xff0c;具有运行速度快、存储量大、安全性高等特点。数据中心东西向流量的占比更大&#xff0c;传统的园区网…...

2022学年第一学期郑州大学ACM招新赛选拔赛

A SW的与众不同数组 — 签到 一共n个数&#xff0c; 用set无重复值的性质统计一下有几个不同的数&#xff0c;记为 res n - res 如果是偶数 每次删除两个刚好可以&#xff0c;如果是奇数需要再删除一个不重复的数完成对应操作 #include <iostream> #include <set>…...

牛客网 Applese 走方格

题目链接&#xff1a;点击查看 题解&#xff1a;我们容易发现到当n,m都为奇数时&#xff0c;是回不到原点的&#xff0c;因为你无论哪个方向走一去一回就是两步&#xff0c;所以n和m必然有一个偶数&#xff0c;那至于我们怎么走呢&#xff0c;看下图&#xff0c;注意的是n1,m2…...

mysql重置Root密码

方法一: 在my.ini的[mysqld]字段加入&#xff1a; skip-grant-tables 重启mysql服务&#xff0c;这时的mysql不需要密码即可登录数据库 然后进入mysql mysql>use mysql; mysql>更新 user set passwordpassword(新密码) WHERE Userroot; mysql>flush privileges; 运…...

C · 初阶 | 循环语句

啊我摔倒了..有没有人扶我起来学习.... &#x1f471;个人主页&#xff1a;《CGod的个人主页》\color{Darkorange}{《CGod的个人主页》}《CGod的个人主页》交个朋友叭~ &#x1f492;个人社区&#xff1a;《编程成神技术交流社区》\color{Darkorange}{《编程成神技术交流社区》…...

idea常用技巧收集

idea相比eclipse的优点我在这里就不赘述了&#xff0c;更多参考&#xff1a;idea官网,本文重点讲下自己在idea使用过程中常用的一些技巧&#xff0c;以后随时更新…… 主要分成三大块&#xff1a; 1. 系统设置 2. 快捷键 3. 其他设置 系统设置 主题风格设置&#xff1a;默…...

深入理解spark高阶算子combineByKey

今天来详细说说spark中的一个比较底层的算子combineByKey。 熟悉spark的朋友应该知道&#xff0c;spark里面有很多类型的算子&#xff0c;有些比较基础&#xff0c;什么map&#xff0c;filter&#xff0c;可能看一眼就会了&#xff0c;有些稍微复杂点&#xff0c;但是也不难懂…...

架构设计 例子和实践 系统设计说明书

架构设计 例子和实践 系统设计说明书(架构、概要、详细)目录结构演进架构中的领域驱动设计Web架构设计经验分享软件架构设计从MVC框架看MVC架构的设计领域驱动设计(Domain Driven Design)参考架构详解关于垂直切分Vertical Sharding的粒度企业应用集成与开源ESB产品ServiceMix和…...

想要玩转实现负载均衡,你知道这些吗?

转载自 想要玩转实现负载均衡&#xff0c;你知道这些吗&#xff1f; 一、前言 互联网早期&#xff0c;业务流量比较小并且业务逻辑比较简单&#xff0c;单台服务器便可以满足基本的需求&#xff1b;但随着互联网的发展&#xff0c;业务流量越来越大并且业务逻辑也越来越复杂&…...

算法 - 里程表故障

题目描述 You are given a car odometer which displays the miles traveled as an integer. The odometer has a defect, however: it proceeds from the digit 2 to the digit 4 and from the digit 7 to the digit 9, always skipping over the digit 3 and 8. This defect…...