Java实战03之idea pringboot 整合log4j2日志,可以多日志文件

2023-11-02

目录

前言:

一、先添加pom.xml 依赖

二、log4j2.xml 配置

三、application.yml

四、加几条测试日志

五、采用注解@log4j2

1、log4j2.xml 配置

2、测试类​编辑

启动项目,

​编辑

六、打印多个不同日志文件日志

1、log4j2.xml 配置

2、测试类


前言:

接着上面实战02讲,连上数据库以后肯定是希望可打印日志的.说明一下常用的日志方法

logbak其实可以说是 Log4J 的进化版,解决了Log4j无法用占位符的问题。

log4j2是重写之后性能比较好的。

slf4j 比较方便,由于他是抽象层,不能单独使用,需要配合其他日志的使用,这样就可以很好的集成其他日志,不用频繁地去切换日志的配置。

log4j2 应用是最广泛的,所以我们也采用它。

一、先添加pom.xml 依赖

<!-- exclude掉spring-boot的默认log配置 ,不然会报包冲突错误-->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter</artifactId>
    <exclusions>
        <exclusion>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-logging</artifactId>
        </exclusion>
    </exclusions>
</dependency>

<!-- 引入log4j2依赖 -->
<dependency>
    <groupId>org.apache.logging.log4j</groupId>
    <artifactId>log4j-core</artifactId>
    <version>2.19.0</version>
</dependency>
<dependency>
    <groupId>org.apache.logging.log4j</groupId>
    <artifactId>log4j-api</artifactId>
    <version>2.19.0</version>
</dependency>
<dependency>
    <groupId>org.apache.logging.log4j</groupId>
    <artifactId>log4j-slf4j-impl</artifactId>
    <version>2.19.0</version>
</dependency>

二、log4j2.xml 配置

<?xml version="1.0" encoding="UTF-8" ?>
<Configuration monitoringInterval="3600" shutdownHook="disable">
    <Properties>
        <!--日志目录-->
        <Property name="basedir">logs/server</Property>
        <!--日志名称-->
        <Property name="all-logger">all-logger</Property>
    </Properties>
    <Appenders>
        <!--控制台输出-->
        <Console name="console" target="SYSTEM_OUT">
            <!--日志样式pattern-->
            <PatternLayout pattern="%highlight{[%d{yyyy-MM-dd HH:mm:ss.SSS}] - [%p] - [%c:%L] - [Method = %M] - [%m]}%n"/>
        </Console>

        <!--全部日志输出-->
        <!--RollingFile实现日志文件滚动更新-->
        <RollingFile name="${all-logger}" fileName="${basedir}/${all-logger}.log" append="true" filePattern="${basedir}/$${date:yyyy-MM}/${all-logger}-%d{yyyy-MM-dd}-%i.log.gz">
            <PatternLayout pattern="%highlight{[%d{yyyy-MM-dd HH:mm:ss.SSS}] - [%p] - [%c:%L] - [Method = %M] - [%m]}%n"/>
            <Policies>
                <!--单个日志文件大小,-->
                <SizeBasedTriggeringPolicy size="50 MB"/>
                <!--只留一个文件,其他的全部压缩-->
                <TimeBasedTriggeringPolicy interval="1" modulate="true" />
            </Policies>
            <!--max参数指定了计数器的最大值。一旦计数器达到了最大值,过旧的文件将被删除-->
            <DefaultRolloverStrategy max="30" compressionLevel="9">
                <!--basePath指定了扫描开始路径,为baseDir文件夹。maxDepth指定了目录扫描深度,为2表示扫描baseDir文件夹及其子文件夹。IfFileName指定了文件名需满足的条件,IfLastModified指定了文件修改时间需要满足的条件。-->
                <Delete basePath="${basedir}" maxDepth="2">
                    <IfFileName glob="*/*.log.gz"/>
                    <IfLastModified age="7d"/>
                </Delete>
            </DefaultRolloverStrategy>
        </RollingFile>

    </Appenders>

    <Loggers>
        <!--过滤掉spring和mybatis的一些无用的DEBUG信息-->
        <Logger name="org.springframework" level="INFO"/>
        <Logger name="org.mybatis" level="INFO"/>
        <Logger name="com.zaxxer.hikari" level="INFO"/>
        <logger name="org.springframework" level="info" additivity="false" includeLocation="true">
            <AppenderRef ref="console"/>
            <AppenderRef ref="${all-logger}"/>
        </logger>

        <!--如果只是想输出sql语句 ,日志级别为DEBUG;如果既需要打印sql语句也需要打印sql执行结果集则修改日志级别为-TRACE-->
        <logger name="com.example.demo" level="DEBUG" additivity="false" includeLocation="true">
            <AppenderRef ref="console"/>
            <AppenderRef ref="${all-logger}"/>
        </logger>

        <!--根记录全部输出到控制台上-->
        <root level="DEBUG">
            <appender-ref ref="console"/>
            <appender-ref ref="${all-logger}"/>
        </root>

    </Loggers>

</Configuration>

三、application.yml

 
server:
  port: 8099
  servlet:
    context-path: /demo
 
# 多数据源
spring:
  datasource:
    driver-class-name: com.mysql.jdbc.Driver
    url: jdbc:mysql://XXXXX?allowMultiQueries=true&useUnicode=true&characterEncoding=utf8&useSSL=true&serverTimezone=GMT%2B8&autoReconnect=true&failOverReadOnly=false
    username: XXXXX
    password: XXXXX
 
mybatis:
  mapper-locations: classpath:/mapper/*.xml
  configuration:
    map-underscore-to-camel-case: false
    log-impl: org.apache.ibatis.logging.slf4j.Slf4jImpl
 
logging:
  config: classpath:log4j2.xml
  level:
    com.example.demo.**.mapper: debug

四、加几条测试日志

StudentinfoController 加几条日志

最后项目的完整结构如下

启动项目,http://localhost:8099/demo/studentinfoController/selectStudent

 控制台日志

 文件日志

这里有一个问题,可以看到 打印的sql 只有语句,没有查询结果,如果想要打印结果,可以改成这样

<!--如果只是想输出sql语句 ,日志级别为DEBUG;如果既需要打印sql语句也需要打印sql执行结果集则修改日志级别为TRACE-->
<logger name="com.example.demo" level="TRACE" additivity="false" includeLocation="true">
    <AppenderRef ref="console"/>
    <AppenderRef ref="${all-logger}"/>
</logger>
这个时候你就会看到打印这样的结果

控制台

 文件

 不过不建议打印结果,因为往往我们查询结果会很大,所以不打印为好。

五、采用注解@log4j2

1、log4j2.xml 配置

<!--sql日志输出-->
        <!--RollingFile实现日志文件滚动更新-->
        <RollingFile name="SQLAppender" fileName="${basedir}/SQLAppender.log" append="true" filePattern="${basedir}/$${date:yyyy-MM}/${all-logger}-%d{yyyy-MM-dd}-%i.log.gz">
            <PatternLayout pattern="%highlight{[%d{yyyy-MM-dd HH:mm:ss.SSS}] - [%p] - [%c:%L] - [Method = %M] - [%m]}%n"/>
            <Policies>
                <!--单个日志文件大小,-->
                <SizeBasedTriggeringPolicy size="50 MB"/>
                <!--只留一个文件,其他的全部压缩-->
                <TimeBasedTriggeringPolicy interval="1" modulate="true" />
            </Policies>
            <!--max参数指定了计数器的最大值。一旦计数器达到了最大值,过旧的文件将被删除-->
            <DefaultRolloverStrategy max="30" compressionLevel="9">
                <!--basePath指定了扫描开始路径,为baseDir文件夹。maxDepth指定了目录扫描深度,为2表示扫描baseDir文件夹及其子文件夹。IfFileName指定了文件名需满足的条件,IfLastModified指定了文件修改时间需要满足的条件。-->
                <Delete basePath="${basedir}" maxDepth="2">
                    <IfFileName glob="*/*.log.gz"/>
                    <IfLastModified age="7d"/>
                </Delete>
            </DefaultRolloverStrategy>
        </RollingFile>



<!--service-->
        <RollingFile name="ServiceAppender" fileName="${basedir}/ServiceAppender.log" append="true" filePattern="${basedir}/$${date:yyyy-MM}/${all-logger}-%d{yyyy-MM-dd}-%i.log.gz">
            <PatternLayout pattern="%highlight{[%d{yyyy-MM-dd HH:mm:ss.SSS}] - [%p] - [%c:%L] - [Method = %M] - [%m]}%n"/>
            <Policies>
                <!--单个日志文件大小,-->
                <SizeBasedTriggeringPolicy size="50 MB"/>
                <!--只留一个文件,其他的全部压缩-->
                <TimeBasedTriggeringPolicy interval="1" modulate="true" />
            </Policies>
            <!--max参数指定了计数器的最大值。一旦计数器达到了最大值,过旧的文件将被删除-->
            <DefaultRolloverStrategy max="30" compressionLevel="9">
                <!--basePath指定了扫描开始路径,为baseDir文件夹。maxDepth指定了目录扫描深度,为2表示扫描baseDir文件夹及其子文件夹。IfFileName指定了文件名需满足的条件,IfLastModified指定了文件修改时间需要满足的条件。-->
                <Delete basePath="${basedir}" maxDepth="2">
                    <IfFileName glob="*/*.log.gz"/>
                    <IfLastModified age="7d"/>
                </Delete>
            </DefaultRolloverStrategy>
        </RollingFile>

 <Loggers>
        <!--过滤掉spring和mybatis的一些无用的DEBUG信息-->
        <Logger name="org.springframework" level="INFO"/>
        <Logger name="org.mybatis" level="INFO"/>
        <Logger name="com.zaxxer.hikari" level="INFO"/>
        <logger name="org.springframework" level="info" additivity="false" includeLocation="true">
            <AppenderRef ref="console"/>
        </logger>

        <!--如果只是想输出sql语句 ,日志级别为DEBUG;如果既需要打印sql语句也需要打印sql执行结果集则修改日志级别为-TRACE-->
        <asyncLogger name="com.example.demo" level="DEBUG" additivity="false" includeLocation="true">
            <AppenderRef ref="console"/>
            <AppenderRef ref="SQLAppender"/>
        </asyncLogger>

       
        <!-- 定义一个注解名称-->
        <asyncLogger name="SERVICEACTION" additivity="false" level="info">
            <AppenderRef ref="console"/>
            <appender-ref ref="ServiceAppender" />
        </asyncLogger>


        <!--根记录全部输出到控制台上-->
        <asyncRoot level="info">
        <!-- 注:部署时,只用 DefaultAppender 开发时只用Console -->
            <appender-ref ref="Console"/>
            <appender-ref ref="SERVICEACTION"/>
        </asyncRoot>

2、测试类

启动项目,

控制台:

service 日志文件

 sql 日志文件

六、打印多个不同日志文件日志

首先注解的形式就注定了单个注解文件只能打印到一个文件里面,mybatis 的特殊日志除外,如果想要一个类里面打印日志到不同文件里面,就可以采用下面这种方法

1、log4j2.xml 配置

<?xml version="1.0" encoding="UTF-8" ?>
<Configuration monitoringInterval="3600" shutdownHook="disable">
    <Properties>
        <!--日志目录-->
        <Property name="basedir">logs/server</Property>

    </Properties>

    <Appenders>
        <!--控制台输出-->
        <Console name="console" target="SYSTEM_OUT">
            <!--日志样式pattern-->
            <PatternLayout pattern="%highlight{[%d{yyyy-MM-dd HH:mm:ss.SSS}] - [%p] - [%c:%L] - [Method = %M] - [%m]}%n"/>
        </Console>

        <!--service-->
        <RollingFile name="ServiceAppender" fileName="${basedir}/ServiceAppender.log" append="true" filePattern="${basedir}/$${date:yyyy-MM}/ServiceAppender-%d{yyyy-MM-dd}-%i.log.gz">
            <PatternLayout pattern="%highlight{[%d{yyyy-MM-dd HH:mm:ss.SSS}] - [%p] - [%c:%L] - [Method = %M] - [%m]}%n"/>
            <Policies>
                <!--单个日志文件大小,-->
                <SizeBasedTriggeringPolicy size="50 MB"/>
                <!--只留一个文件,其他的全部压缩-->
                <TimeBasedTriggeringPolicy interval="1" modulate="true" />
            </Policies>
            <!--max参数指定了计数器的最大值。一旦计数器达到了最大值,过旧的文件将被删除-->
            <DefaultRolloverStrategy max="30" compressionLevel="9">
                <!--basePath指定了扫描开始路径,为baseDir文件夹。maxDepth指定了目录扫描深度,为2表示扫描baseDir文件夹及其子文件夹。IfFileName指定了文件名需满足的条件,IfLastModified指定了文件修改时间需要满足的条件。-->
                <Delete basePath="${basedir}" maxDepth="2">
                    <IfFileName glob="*/*.log.gz"/>
                    <IfLastModified age="7d"/>
                </Delete>
            </DefaultRolloverStrategy>
        </RollingFile>

        <!--task 日志-->
        <RollingFile name="TaskAppender" fileName="${basedir}/TaskAppender.log" append="true" filePattern="${basedir}/$${date:yyyy-MM}/${TaskAppender-%d{yyyy-MM-dd}-%i.log.gz">
            <PatternLayout pattern="%highlight{[%d{yyyy-MM-dd HH:mm:ss.SSS}] - [%p] - [%c:%L] - [Method = %M] - [%m]}%n"/>
            <Policies>
                <!--单个日志文件大小,-->
                <SizeBasedTriggeringPolicy size="50 MB"/>
                <!--只留一个文件,其他的全部压缩-->
                <TimeBasedTriggeringPolicy interval="1" modulate="true" />
            </Policies>
            <!--max参数指定了计数器的最大值。一旦计数器达到了最大值,过旧的文件将被删除-->
            <DefaultRolloverStrategy max="30" compressionLevel="9">
                <!--basePath指定了扫描开始路径,为baseDir文件夹。maxDepth指定了目录扫描深度,为2表示扫描baseDir文件夹及其子文件夹。IfFileName指定了文件名需满足的条件,IfLastModified指定了文件修改时间需要满足的条件。-->
                <Delete basePath="${basedir}" maxDepth="2">
                    <IfFileName glob="*/*.log.gz"/>
                    <IfLastModified age="7d"/>
                </Delete>
            </DefaultRolloverStrategy>
        </RollingFile>

        <!--sql日志输出-->
        <!--RollingFile实现日志文件滚动更新-->
        <RollingFile name="SQLAppender" fileName="${basedir}/SQLAppender.log" append="true" filePattern="${basedir}/$${date:yyyy-MM}/SQLAppender-%d{yyyy-MM-dd}-%i.log.gz">
            <PatternLayout pattern="%highlight{[%d{yyyy-MM-dd HH:mm:ss.SSS}] - [%p] - [%c:%L] - [Method = %M] - [%m]}%n"/>
            <Policies>
                <!--单个日志文件大小,-->
                <SizeBasedTriggeringPolicy size="50 MB"/>
                <!--只留一个文件,其他的全部压缩-->
                <TimeBasedTriggeringPolicy interval="1" modulate="true" />
            </Policies>
            <!--max参数指定了计数器的最大值。一旦计数器达到了最大值,过旧的文件将被删除-->
            <DefaultRolloverStrategy max="30" compressionLevel="9">
                <!--basePath指定了扫描开始路径,为baseDir文件夹。maxDepth指定了目录扫描深度,为2表示扫描baseDir文件夹及其子文件夹。IfFileName指定了文件名需满足的条件,IfLastModified指定了文件修改时间需要满足的条件。-->
                <Delete basePath="${basedir}" maxDepth="2">
                    <IfFileName glob="*/*.log.gz"/>
                    <IfLastModified age="7d"/>
                </Delete>
            </DefaultRolloverStrategy>
        </RollingFile>

    </Appenders>

    <Loggers>
        <!--过滤掉spring和mybatis的一些无用的DEBUG信息-->
        <Logger name="org.springframework" level="INFO"/>
        <Logger name="org.mybatis" level="INFO"/>
        <Logger name="com.zaxxer.hikari" level="INFO"/>
        <logger name="org.springframework" level="info" additivity="false" includeLocation="true">
            <AppenderRef ref="console"/>
        </logger>

        <!-- 定义一个注解名称-->
        <asyncLogger name="SERVICEACTION" additivity="false" level="info">
            <AppenderRef ref="console"/>
            <appender-ref ref="ServiceAppender" />
        </asyncLogger>

        <asyncLogger name="TASKACTION" additivity="false" level="info">
            <AppenderRef ref="console"/>
            <appender-ref ref="TaskAppender" />
        </asyncLogger>

        <!--如果只是想输出sql语句 ,日志级别为DEBUG;如果既需要打印sql语句也需要打印sql执行结果集则修改日志级别为-TRACE-->
        <asyncLogger name="com.example.demo" level="DEBUG" additivity="false" includeLocation="true">
            <AppenderRef ref="console"/>
            <AppenderRef ref="SQLAppender"/>
            <appender-ref ref="ServiceAppender"/>
        </asyncLogger>

        <!--根记录全部输出到控制台上-->
        <asyncRoot level="info">
            <!-- 注:部署时,只用 DefaultAppender 开发时只用Console -->
            <appender-ref ref="Console"/>
            <appender-ref ref="ServiceAppender"/>
        </asyncRoot>


    </Loggers>

</Configuration>

2、测试类

启动项目。

控制台:

 task文件

service文件

 

 sql文件

 这样就很完美了。

如果还是想用注解,那就只能两种结合使用了,注解+logger.getname

控制台

 service

 sql

 task

 
以上就是最完整的 idea +Maven+springboot+mybatis+log4j2 的结合使用了。

如果觉得对你有帮助的话欢迎点赞关注哦!
 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Java实战03之idea pringboot 整合log4j2日志,可以多日志文件 的相关文章

  • 将比较器对象存储在数组中

    我为我的对象定义了 4 个比较器 如下所示 public static Comparator
  • JPA 实体中的方法是否允许抛出异常?

    我尝试创建的 Entity 有问题 当尝试使用 OpenJPA 实现在 Eclipse 中测试类时出现问题 我有not尝试过其他人 所以不确定它是否适用于他们 我的测试用例非常简单 因为它创建一个 EntityManagerFactory
  • 在 Java 中重置 Graphics2D 对象

    我正在用 Java 尝试 Graphics2D 但像往常一样 我被困住了 P 问题是 假设我有这个代码 Graphics2D g Graphics2D this getGraphics Inside a JFrame g rotate Ma
  • 模拟框架对我有什么作用?

    我听说有些我无法交谈的人是 jmock 的忠实粉丝 我已经做了以测试为中心的开发多年 所以我浏览了网站并查看了一些文档 但仍然不知道它有什么好处 我对春天也有同样的问题 如果您已经了解它是什么 他们的文档会很好地解释它 所以我并不认为 jm
  • mvn dependency:analyze 结果不正确

    我一直在寻找一种工具 它能够向您显示未使用的依赖项 我很快就偶然发现了 Maven 命令mvn dependency analyze 这样做的问题是 它经常检测到 未使用的 依赖项 如果缺失 这些依赖项就会导致构建失败 这是优化项目的示例
  • java中如何围绕另一个移动对象旋转一个对象?

    我对 Java 很陌生 想要编写一个简单的太阳系统 其中月球绕地球旋转 地球绕太阳旋转 一切正常 除了月亮不想正确移动 由于地球偏离月球的初始位置 月球的自转半径会根据该距离而增大 同样 当地球接近月球惯性位置时 自转半径会减小 如果初始位
  • C# 中的 Culture 相当于 Java 中的 Locale 吗?

    C 使用文化的概念 这在操作上与 Java 中的 Locale 类似吗 或者底层概念是否存在显着差异 从文化而不是语言环境的角度进行工作是一种寻找正确抽象层次的尝试 从以类似方式做事的人群的角度来考虑事物 而不是谈论地理区域和语言 并有点疯
  • 在 Android 中使用 lambdaj

    有人尝试过在android开发中使用lambdaj库吗 当我创建一个简单的小型java应用程序时 它对我来说工作得很好 但我无法在android应用程序中使用它 UPDATE 我正在添加 lambdaj lambdaj 2 3 2 with
  • 如何提高 Guice 启动时的性能

    好吧 我知道我的计算不客观等等 但无论如何 我讨厌在执行单元测试时等待这么多时间 我的 guice swing 应用程序需要大约 7 秒来初始化 这是一个简单的 IRC 客户端 在那一刻 没有打开连接 我什至还没有调用任何 java io
  • 让 Java 与 Windows 10 Ubuntu 一起使用

    我安装了 Windows 10 周年更新 以便可以在 Windows 上的 Ubuntu 上尝试 Bash 看如何安装 http www howtogeek com 249966 how to install and use the lin
  • 序言中不允许引用

    请帮我找到这个异常的原因 我使用以下罐子 core renderer jar itext paulo 155 jar 第一个文档 xhtml lt xml version 1 0 encoding UTF 8 gt lt DOCTYPE h
  • 如何在最短的时间内克隆java中的输入流

    有人可以告诉我如何克隆输入流 并花费尽可能少的创建时间吗 我需要多次克隆输入流以使用多种方法来处理 IS 我尝试了三种方法 但由于这样或那样的原因 事情不起作用 方法 1 感谢 stackoverflow 社区 我发现以下链接很有帮助 并将
  • Java 中 LINQ 的等价物是什么? [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 Java 中 LINQ 的等价物是什么 没有什么比 LINQ for Java 更好的了 Edit 现在
  • 如何将我的自定义相机应用程序设置为默认应用程序?

    如果我使用以下代码 Intent takePictureIntent new Intent MediaStore ACTION IMAGE CAPTURE startActivityForResult takePictureIntent 1
  • 在调试模式下,哪些代码更改会自动反映在 Eclipse 中?

    我使用 eclipse 用于编写 调试 作为 IDE 在调试模式下 当我进行一些更改 例如初始化局部变量 时 它们会自动反映 但其他更改例如更改静态变量的值 有时我会收到一条消息 说我需要重新启动虚拟机 有时则不需要 现在的问题是哪些类型的
  • 用于将字符串与通配符模式进行匹配的递归函数

    所以我一整天都在试图解决这个作业 只是无法完成 以下函数接受 2 个字符串 第二个 不是第一个 可能包含 的 星号 An 是字符串的替换 空 1个字符或更多 它可以出现 仅在s2中 一次 两次 更多或根本不出现 它不能与另一个相邻 ab c
  • java.lang.NoClassDefFoundError:com.google.ads.AdView

    我正在尝试将 admob 广告合并到我的应用程序中 到目前为止我已经添加了以下代码 在我的应用程序主要活动的 onCreate 方法中 adView new AdView this AdSize BANNER my code number
  • Spring Data JPA 和 Exists 查询

    我正在使用 Spring Data JPA 使用 Hibernate 作为我的 JPA 提供程序 并想要定义一个exists附加 HQL 查询的方法 public interface MyEntityRepository extends C
  • 当我必须在 Netty4 编码器中调用 ByteBuf.retain() 时?

    我正在编写一个以 NUL 终止 JSON 消息的编码器 以便在消息碎片的情况下可以对其进行解码 我找到了这个样本 gt click https github com netty netty blob master codec src mai
  • 跳过一行GridBagLayout

    我在 JFrame 上使用 GridBagLayout 我希望能够跳过一两行 但将这些行显示为空白 然后在这些行后面有一个按钮 我在文档中找不到任何方法来执行我所描述的操作 有谁知道我可以执行此操作的任何方法吗 发现它比添加空组件干净得多

随机推荐

  • PCL (再探)点云配准精度评价指标——均方根误差

    目录 一 算法原理 二 代码实现 三 代码解析 四 备注 本文由CSDN点云侠原创 原文链接 如果你不是在点云侠的博客中看到该文章 那么此处便是不要脸的爬虫 一 算法原理 见 点云配准精度评价指标 均方根误差 PCL 点云配准精度评价 点到
  • 【技术分享】搭建java项目引入外部依赖教程

    文章目录 引言 如何在linux中编译运行java程序 IDEA中新建一个简单的java工程项目并运行 IDEA中如何引入外部依赖并运行 maven引入log4j jar包 手工引入log4j jar包 如何使用命令行的方式添加外部依赖 如
  • 2021-01-07 库存锁定问题

    前言 今天同事突然问我 要是一个商品我直接下单所有库存 那么是不是要等到订单取消后另一个人才可以下单 我思考了下 确实是需要限制一下 下面是我参考的方案 方案 下单锁库存 支付锁库存 通过淘宝测试 n件以内下单是下单锁库存 n件以上是支付锁
  • 2021年华数杯数学建模A题电动汽车无线充电优化匹配研究求解全过程文档及程序

    2021年华数杯数学建模 A 题 电动汽车无线充电优化匹配研究 原题再现 电动汽车以环境污染小 噪音低 能源利用效率高 维修方便等优势深受消费者青睐 但现有电动汽车的有线充电方式操作复杂 且存在安全隐患 因此采用无线充电方式对电动汽车进行快
  • 算法——最小生成树与最短路径相关算法

    最小生成树算法 普利姆算法代码参考 https blog csdn net tingting256 article details 50471033 具体如何判断是否构成回路 举例说明 克鲁斯卡尔算法代码参考 https blog csdn
  • ValueError: The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() ora.l

    小白随手记录改bug过程 if G nodes node source print type G nodes node 开始的代码 报错如标题 分析应该是将一个值与多个值或一个列表中的值相比较 匹配的原因 source是一个列表有多个值 遂
  • 华为OD题目: 预订酒店

    预订酒店 预订酒店 题目 放暑假了 小明决定到某旅游景点游玩 他在网上搜索到了各种价位的酒店 长度为 的数组 A 他的心理价位是X元 请都他篇先出k 个最接近x 元的酒店 n gt k gt 0 并由低到高打印酒店的价格 输入 第一行 n
  • 关于R实现多重插补及其可视化

    提示 文章写完后 目录可以自动生成 如何生成可参考右边的帮助文档 文章目录 前言 一 进行多重插补 二 多重插补结果可视化 三 结果评估与结果选择 前言 接着对前文数据集进行多重插补来填补缺失值 利用的是mice包中的airquality数
  • VC++ 程序启动即隐藏

    所谓的隐藏是程序启动后不显示主窗体 网上介绍了很多方法 是否达到效果 众说纷纭 这里只介绍一种在项目中实际应用到的切实可行的方法 这里假设主窗体为CMainDialog 1 变量声明 BOOL m bShowWindow 2 给变量赋初始值
  • 爬虫python能做什么-Python除了能做爬虫之外还能做什么?

    原标题 Python除了能做爬虫之外还能做什么 1 web开发python拥有非常完善的与web服务器进行交互的库 以及大量的免费的前端网页模板 更具优势的是 有非常优秀且成熟的Django Web框架 功能一应俱全 请输入图片描述 2 l
  • Linux-交叉编译-linuxptp

    参考文档 https blog csdn net BUPTOctopus article details 86246335 Linux PTP官网介绍 http linuxptp sourceforge net 1 LinuxPTP源码下载
  • 这30个CSS选择器,你必须熟记(上)

    关注前端达人 与你共同进步 CSS的魅力就是让我们前端工程师像设计师一样进行网页的设计 我们能轻而易举的改变颜色 布局 制作出漂亮的影音效果等等 我们只需要改几行代码 不需要借助任何软件 就能轻而易举的实现 感觉就像魔法师一般 几秒钟就能得
  • 多线程并行 Dijkstra与A*算法结合实践

    多线程并行 Dijkstra与A 算法融合 1 Dijkstra总能找到最优解 但是时间消耗大 本文实现了多线程并行的搜索算法 使得路径搜素时间缩短约1 3 2 H作为传入参数可以使得本算法可以切换为A 也可以变为Dijkstra 3 本算
  • 冒泡法对10个数升序排序

    include
  • 智能合约编写之Solidity的编程攻略|FISCO BCOS超话区块链专场(篇5)

    前 言 作为一名搬砖多年的资深码农 刚开始接触Solidity便感觉无从下手 昂贵的计算和存储资源 简陋的语法特性 令人抓狂的debug体验 近乎贫瘠的类库支持 一言不合就插入汇编语句 让人不禁怀疑 这都已经过了9012年了 居然还有这种反
  • 在这么“内卷”的时期,作为转行python两年的人,想给学python的提个醒....

    近日 顶级互联网外企 PayPal 的秋招要求引发了技术界热议 其官方招聘公众号上显示 本次校招仅面向硕士和博士 消息一出 不少程序员都震惊了 现在已经这么卷了吗 只要硕士 其实 不仅是PayPal 许多世界级外企如微软 Intel在招聘时
  • 移动端Loading的两种方式--RN

    方式一 1 先封装一个 Loading 组件 import React from react import StyleSheet View ActivityIndicator from react native const Loading
  • python pip换源、更新

    pip临时使用 pip install i https pypi tuna tsinghua edu cn simple some package pip更新 使用镜像源更新 pip install pip U pip install i
  • FILE结构体与fd文件标识符

    FILE结构体 我们通常对文件进行操作时 都会使用一些与文件相关的函数 比如 打开文件 FILE fopen const char path const char mode 关闭文件 int fclose FILEE fp 读文件 size
  • Java实战03之idea pringboot 整合log4j2日志,可以多日志文件

    目录 前言 一 先添加pom xml 依赖 二 log4j2 xml 配置 三 application yml 四 加几条测试日志 五 采用注解 log4j2 1 log4j2 xml 配置 2 测试类 编辑 启动项目 编辑 六 打印多个不