• 从零搭建开发脚手架 Logback使用janino实现条件判断


    引入依赖

    <dependency>
        <groupId>org.codehaus.janinogroupId>
        <artifactId>janinoartifactId>
        <version>3.0.6version>
    dependency>
    
    • 1
    • 2
    • 3
    • 4
    • 5

    语法

    if-then语法:

       
       <if condition="some conditional expression">
        <then>
          ...
        then>
      if>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    if-then-else语法:

      
      <if condition="some conditional expression">
        <then>
          ...
        then>
        <else>
          ...
        else>    
      if>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    条件表达式

    property() or p()

    只能访问上下文属性或者系统属性。对于作为参数传递的键,property()p()方法返回属性的String的值。

    property("someKey").contains("someValue")
    p("someKey").contains("someValue")
    Boolean.valueOf(property("someValue"))
    
    • 1
    • 2
    • 3

    isDefined()

    用来检查属性是否定义

    isDefined("someKey")
    
    • 1

    isNull()

    用来检查属性是否为空

    isNull("someKey")
    
    • 1

    变量

    logback 中,支持以 ${varName} 来引用变量

    定义变量

    1.可以直接在 logback.xml 中定义变量
    <configuration>
      <property name="USER_HOME" value="/home/sebastien" />
      <appender name="FILE" class="ch.qos.logback.core.FileAppender">
        <file>${USER_HOME}/myApp.logfile>
    
    • 1
    • 2
    • 3
    • 4
    2.可以通过启动参数大D来定义
    java -DUSER_HOME="/home/sebastien" -jar xxx.jar
    
    • 1
    3.可以通过外部文件来定义
    <configuration>
      <property file="src/main/java/chapters/configuration/variables1.properties" />
    
    • 1
    • 2

    外部文件也支持 classpath 中的文件

    <configuration>
      <property resource="resource1.properties" />
    
    • 1
    • 2

    外部文件的格式是 key-value 型

    USER_HOME=/home/sebastien
    
    • 1

    变量作用域

    定义的变量是有作用域的,如本地作用域,上下文作用域,系统级作用域。默认是本地作用域。

    • local
    • context
    • system

    local 作用域在配置文件内有效,context 作用域的有效范围延伸至 logger context,system 作用域的范围最广,整个 JVM 内都有效。

    logback 在替换变量时,首先搜索 local 变量,然后搜索 context,然后搜索 system,最后是OS environment。

    为变量指定 scope

    <property scope="context" name="nodeId" value="firstNode" />
    
    • 1
    变量的默认值

    在引用一个变量时,如果该变量未定义,那么可以为其指定默认值,做法是:

    ${aName:-golden}
    
    • 1

    实战

    1.读取上下文变量的值

    
    <configuration>
        
        <springProperty scope="context" name="log.console" source="log.console"/>
        
        <property scope="context" resource="application.properties" />
        
        <property name="log.console" value="true"/>
        ...
        <root level="INFO">
            <appender-ref ref="file"/>
            <if condition='Boolean.valueOf(property("log.console"))'>
                <then>
                    <appender-ref ref="console"/>
                then>
            if>
        root>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    application.yml的配置如下:

    log:
      console: true
    
    • 1
    • 2

    或者指定配置文件时,在 application.properties文件配置

    log.console=true
    
    • 1

    2.读取系统变量的值

    1.通过命令行设置

    java -Dlog.console=true -jar xxx.jar
    
    • 1

    2.通过System.setProperty设置系统变量

    System.setProperty("log.console","true");
    
    • 1

    注意代码设置位置,在main入口处,否则不起作用

    3.设置环境变量

    下面这种方式跟你在我的电脑- 高级设置 - 环境变量 设置是一个效果

    附加:环境变量和系统变量的区别

    1.作用对象不同

    • 环境变量(environment variable)指的是操作系统中配置的环境变量;

    • 系统变量(System variables)指的是赋给应用系统的值;

    2.获取方式不同

    • 环境变量在java中通过System.getenv()方法获取到;

    • 系统变量在java中通过System.getProperty()方法获取到;

  • 相关阅读:
    06-JVM对象内存回收机制深度剖析
    微信小程序第三天
    Linux安装Jenkins
    tomcat优化、nginx +tomcat 部署 (三)
    搭建大型分布式服务(四十)SpringBoot 整合多个kafka数据源-支持生产者
    c++中的对齐问题
    MySQL----常见的存储引擎
    zabbix自定义模板,邮件报警,代理服务器,自动发现与自动添加及snmp
    ROS基础-ROS msg发布订阅:嵌套自定义类型 数组
    【快速解决】实验三 简单注册的实现《Android程序设计》实验报告
  • 原文地址:https://blog.csdn.net/abu935009066/article/details/128003660