精华内容
下载资源
问答
  • Logback.xml变量指定默认值

    千次阅读 2020-01-17 21:09:37
    随着通用日志组件转入 Slf4j,logback 也变成了默认的日志实现,像 log4j 一样,logback.xml 中也可以使用系统属性或环境变量,如 ${catalina.home}。在 log4j.properties 中,如果变量在系统属性和环境变量中找不到...

    Logback.xml 给变量指定默认值

    随着通用日志组件转入 Slf4j,logback 也变成了默认的日志实现,像 log4j 一样,logback.xml 中也可以使用系统属性或环境变量,如 ${catalina.home}。在 log4j.properties 中,如果变量在系统属性和环境变量中找不到的话默认为 “” 空字符串,而到了 logback.xml 中如果某个变量找不到默认就是 “变量名_IS_UNDEFINED” 了,这样就比较奇怪了。

    那如何在没有配置 catalina.home 系统属性或环境变量时设置一个默认值呢,例如,没有 catalina.home 时取值为 “.”,这时值日志文件的路径就是

    ./logs/unmi-%d{yyyy-MM-dd}.log

    了,也就是生成中当前目录下的 logs 子目录中,这样算是很友好的方式。下面就来分析怎么一步步找到答案的,没耐心或是只求结果的话,直接滚屏到下面就行。

    我们的问题是,对于下面那样的 logback.xml 配置:

    <?xml version="1.0" encoding="UTF-8"?>
     
    <configuration>
     
        <appender name="stdout" class="ch.qos.logback.core.ConsoleAppender">
            <encoder charset="UTF-8">
                <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger - %msg%n</pattern>
            </encoder>
        </appender>
     
        <appender name="RollingFile" class="ch.qos.logback.core.rolling.RollingFileAppender">
            <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
                <fileNamePattern>${catalina.home}/logs/unmi-%d{yyyy-MM-dd}.log</fileNamePattern>
                <maxHistory>10</maxHistory>
            </rollingPolicy>
     
            <encoder>
                <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger - %msg%n</pattern>
            </encoder>
        </appender>
     
        <root level="DEBUG">
            <appender-ref ref="stdout" />
            <appender-ref ref="RollingFile" />
        </root>
    </configuration>
    

    因为测试时直接在 Eclipse 或控制台下执行,在未定义 catalina.home 的情况下,一运行就会在当前目录下生成 catalina.home_IS_UNDEFINED 目录,其中有 logs 子目录,再才是 unmi-2014-05-19.log 这个日志文件。
    搜索了网上关于默认值的解决方案,有说在 logback.xml 中写条件表达式,例如:

    <if condition="property('catalina.home')==null">
        <then>
            <fileNamePattern>logs/unmi-%d{yyyy-MM-dd}.log</fileNamePattern>
        </then>
        <else>
            <fileNamePattern>${catalina.home}/logs/unmi-%d{yyyy-MM-dd}.log</fileNamePattern>
        </else>
    </if>
    

    参考: http://logback.qos.ch/manual/configuration.html#conditional 和 http://stackoverflow.com/questions/15911303/how-can-i-configure-logback-conditionally-based-on-context-name。
    上面的 if-then-else 是有问题的 The FileNamePattern option must be set before using TimeBasedRollingPolicy,需要把 if 的覆盖范围扩大,不过试了也不怎么爽。

    回到 IS_UNDEFINED, 它总是有来头的,搜索源代码可找到它出现在 https://github.com/qos-ch/logback/blob/master/logback-core/src/main/java/ch/qos/logback/core/util/OptionHelper.java#L103:

    final static String _IS_UNDEFINED = “_IS_UNDEFINED”;

    还有一处未被使用,这样就有突破口了,再跟踪代码,找到 logback 是怎么取到相对应变量值的 https://github.com/qos-ch/logback/blob/master/logback-core/src/main/java/ch/qos/logback/core/subst/NodeToStringTransformer.java#L102,handleVariable 方法代码片断:

    if (n.defaultPart == null) {
      stringBuilder.append(key + CoreConstants.UNDEFINED_PROPERTY_SUFFIX);
      cycleCheckStack.pop();
      return;
    }
     
    Node defaultPart = (Node) n.defaultPart;
    StringBuilder defaultPartBuffer = new StringBuilder();
    compileNode(defaultPart, defaultPartBuffer, cycleCheckStack);
    cycleCheckStack.pop();
    String defaultVal = defaultPartBuffer.toString();
    stringBuilder.append(defaultVal);
    

    注:从这个类的 lookupKey(String key) 方法中可以知道 logback 从四个地方取变量值,分别是 propertyContainer0, propertyContrainer1, System, Evn,前两不知道没关系,后两个我们明白先从 System 属性,没有再从环境变量中取。

    上面我们会想到 Node 除了有 payload 还有一个 defaultPart 用了设定默认值部分。至于默认值怎么设置,猜测试是 ${catalina.home:abc},没用,不过别急,logback 的测试用例告诉了我们表达式的写法。

    见 https://github.com/qos-ch/logback/blob/master/logback-core/src/test/java/ch/qos/logback/core/util/OptionHelperTest.java#L99, 看到这样写代默认值的表达式

    ${v2:-toto} //格式是 ${变量名:-默认值},光有冒号还不够,再加条短线后面才是默认值

    所以学习它后,前面的日志文件名配置部分就写成

    <!-- 如果没有定义  catalina.home  系统属性或环境变量时,生成的日志文件在 ./logs 目录下 -->
    <fileNamePattern>${catalina.home:-.}/logs/unmi-%d{yyyy-MM-dd}.log</fileNamePattern>
    完整的 logback.xml 内容如下:
    
    
    <?xml version="1.0" encoding="UTF-8"?>
     
    <configuration>
     
        <appender name="stdout" class="ch.qos.logback.core.ConsoleAppender">
            <encoder charset="UTF-8">
                <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger - %msg%n</pattern>
            </encoder>
        </appender>
     
        <appender name="RollingFile" class="ch.qos.logback.core.rolling.RollingFileAppender">
            <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
                <fileNamePattern>${catalina.home:-.}/logs/unmi-%d{yyyy-MM-dd}.log</fileNamePattern>
                <maxHistory>10</maxHistory>
            </rollingPolicy>
     
            <encoder>
                <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger - %msg%n</pattern>
            </encoder>
        </appender>
     
        <root level="DEBUG">
            <appender-ref ref="stdout" />
            <appender-ref ref="RollingFile" />
        </root>
    </configuration>
    

    多看看这 OptionHelperTest 测试用例,还能发现默认值也能用变量,如

    KaTeX parse error: Expected '}', got 'EOF' at end of input: {B:-{A}}

    本文链接 https://unmi.cc/logback-xml-variable-with-default-value/, 来自 隔叶黄莺 Unmi Blog

    展开全文
  • settings.xml自定义变量: &lt;profile&gt; &lt;id&gt;custom-compiler&lt;/id&gt; &lt;properties&gt; &lt;JAVA_HOME&gt;C:\Program Files (x86)\Java\jdk1.8.0_73&...

    settings.xml自定义变量:

    <profile>
      <id>custom-compiler</id>
      <properties>
        <JAVA_HOME>C:\Program Files (x86)\Java\jdk1.8.0_73</JAVA_HOME>
      </properties>
    </profile>
    
    <!--当然这里应该需要激活,所以settings.xml文件还应该有如下配置:-->
    <activeProfiles>
        <activeProfile>custom-compiler</activeProfile>
    </activeProfiles>

    pom.xml即可使用该变量:

    <dependency>
      <groupId>jdk.tools</groupId>
      <artifactId>jdk.tools</artifactId>
      <version>1.8</version>
      <scope>system</scope>
      <systemPath>${JAVA_HOME}/lib/tools.jar</systemPath>
    </dependency>

     

    展开全文
  • 1. pom.xml定义属性 [code="xml"] 0.1.1 [/code] 2. pom.xml配置,使用变量替换 [code="xml"] src/main/java **/*.xml ...
    1. pom.xml定义属性
    
        <properties>
    <project.version>0.1.1</project.version>
    </properties>


    2. pom.xml配置,使用变量替换
            <resources>
    <directory>src/main/java</directory>
    <includes>
    <include>**/*.xml</include>
    </includes>
    <filtering>true</filtering>
    </resource>
    </resources>


    3. spring的applicationContext.xml使用变量
        <bean id="ProjectUtil" class="com.pandy.framework.base.utils.ProjectUtil">
    <property name="projectVersion">
    <value>${project.version}</value>
    </property>
    </bean>
    展开全文
  • xml变量命名和布局

    千次阅读 2012-04-19 16:31:28
    先说变量名命名,也就是xml中的@+id/xxx的命名。 android中各个layout中的命名可以重复。其实仔细想想,如果不可以重复的话,命名空间就会比较混乱。findViewById()也是View干的,所以通过id来找View,只能通过这个...

    这篇文比较白痴吧~~


    先说变量名命名,也就是xml中的@+id/xxx的命名。

    android中各个layout中的命名可以重复。其实仔细想想,如果不可以重复的话,命名空间就会比较混乱。findViewById()也是View干的,所以通过id来找View,只能通过这个View的父View来做。所以不同layout中的id是可以重复的。但是,还是建议命名按照下面的方式:

    layout_name_widget

    例如:main_hello_textview,标识main.xml中一个id为hello的TextView控件。当然textview可以缩写成tv,button可以缩写成btn。

    为什么这么命名?

    1. 用layout做开头是为了在java代码中引用它时,用Content Assist时比较容易找
    2. 结尾用widget名称是因为,用findViewById()找到后常伴有强制类型转换。加个widget类型省得再回去翻xml找类
    中间部分命名就比较随便了,可以按范围从大到小的方式将大模块,小模块添加进去。

    再说公用文件的布局。
    公用文件包括: 
    • AndroidManifest.xml
    • strings.xml
    • colors.xml
    • dimens.xml
    • styles.xml
    等全局一份,而大家都需要修改的文件。大家都需要修改的文件在svn上提交时就会有乱子。每次遇到comflict的时候都去compare一下吗?把每个人写的文件都放在一起就好了。比如:
      <!-- Daniel,占楼待用 START -->
        <string name="blank">███刮开</string>
      <!-- Daniel,占楼待用 START -->;
      <!-- Michael,占楼待用 START -->
        <string name="index_register">注册</string>
        <string name="index_login">登录</string>
      <!-- Michael,占楼待用 START -->;
    大家都把自己的楼盖在自己的家里,等comflict的时候,先把自己的楼复制出来,再replace with head version,最后将自己的楼再覆盖回去就行了。不用找来找去喽~~

    展开全文
  • 在springboot的默认配置文件application.properties中引用pom.xml中的变量 在application.properties中我们引用了hostname这个变量,其中@hostname@代表的是pom.xml中的一个变量 server.port=8081 eureka.instance....
  • 主要介绍了SQL SERVER 将XML变量转为JSON文本的相关资料,需要的朋友可以参考下
  • Android的string.xml使用html与变量

    千次阅读 2015-07-08 18:04:52
    本文介绍了如何在Android的string.xml使用html和变量,并在java中给变量赋值。学会这一技巧将使string.xml变得更加强大。 一、使用html 方法1、使用 CDATA(推荐) string name="demoStr">Data>ABC ]]> ...
  • XML中的变量传值

    2018-09-06 16:35:00
    在action的java类中定义变量之后,在XML中获取该变量进行对应传值:: 在指定方法中获取XML配置文件的变量传值:: 转载于:https://www.cnblogs.com/mangwusuozhi/p/9599288.html...
  • 在pom.xml中自定义变量及其使用

    万次阅读 2017-04-07 10:54:19
    类似于版本号,可能一个组件中的多个jar包都是采用同一版本号,当要升级组件时就需要逐一修改组件中每个jar的版本号,比较繁琐而且容易漏掉,我们可以自定义一个版本号变量,然后组件中的jar包统一调用这个变量即可...
  • android中修改string.xml变量

    千次阅读 2012-11-21 13:13:27
    --------------前言--------------- ...条件就是在此之前string.xml要为某id事先预留变量,代码能够修改它~例如说, 今年是%1$d年 JAVA代码中可用 String a = getResources().getString(R.string.a);
  • pom.xml使用多套环境及变量获取

    千次阅读 2017-07-27 15:57:52
    一般来说,开发、测试、生产的环境都不一样,反复修改配置文件比较麻烦,还容易出错,项目在pom.xml文件中使用了profiles属性,配置了多套环境,有两个比较关键的问题 以下是pom.xml文件中相关代码 <id>dev ...
  • springboot配置跨mapper.xml的全局变量

    千次阅读 热门讨论 2018-12-13 19:17:16
      有这样的需求,mybatis框架的mapper.xml,即映射文件里,如果需要配置一个全局变量,然后,在所有的mapper.xml里都能拿到使用。   这需求也不苛刻吧~   后来查了下,发现对于springboot来说,配置这个竟然...
  • 我们程序中经常将一些状态值归类成枚举类,并不想在XML中将枚举值写死,于是出现了这篇文章,参考了很多文章,找到一种最简单的方式,记录下来,与君分享。 枚举类 package com.test.constant; public enum Animal...
  • yml中使用pom中的变量 在pom文件中增加(使用maven渲染yml) <build> <resources> <resource> <directory>src/main/resources</directory> ...
  • RT,初始化servlet的时候我希望可以通过配置文件来配置这个loginUsername,请问是否可以? ``` <servlet-name>DruidStatView <servlet-class>...```
  • string.xml 特殊符号转义和变量使用

    千次阅读 2015-08-30 17:17:12
    string.xmlxml文件 所以一些特殊符号在xml中需要转义这项需求也被继承下来 但是在android中又比较特殊 而且\在android.xml中代表转义字符 如在string.xml中一个空格或多个空格都只代表一个空格 如果要想多个...
  • 【mybatis】xml中定义变量

    千次阅读 2020-09-18 16:57:16
    xml中定义变量 <select id="selectListByKeyword" parameterType="map" resultMap="xxResult"> <bind name="keywordPattern" value="'%' + _parameter.keyword + '%'" /> select * from xxtable ...
  • web.xml设置全局变量

    千次阅读 2017-03-25 04:31:49
    [html] view plain copy   context-param>   param-name>param_nameparam-name>   param-value>param_valueparam-value>...此所设定的参数,在JSP网页中可以使用下列方法来取得:${initParam.par
  • 2019独角兽企业重金招聘Python工程师标准>>> ...
  • kettle xml 读取配置变量

    千次阅读 2015-12-15 00:42:51
    场景: A数据库 跟 B 数据库 进行 对接,做简单 每个月月初 汇总工作
  • web项目中,在web.xml中配置全局变量

    千次阅读 2017-09-10 15:39:38
    在web.xml中设置全局变量
  • 该jar包功能,可以在一个properties文件里面定义jdbc.url=${url},在另一个properties文件定义具体的值,通过该jar可以获取到哪个具体的值。下载之后,自行安装到本地...具体pom.xml配置使用可以参考网络其他博文,谢谢
  • string.xml中如何定义变量

    千次阅读 2016-05-11 08:54:10
    在string.xml中,不仅可以设置文字的格式换行等,还可以设置类似于变量的文本格式。 方法一: 1、整型,比如“我今年27岁了”,这个27是整型的。在string.xml中可以这样写 name="my_age">我今年%1$d岁了 在程序中...
  • select * from demo where status = '${@cn.jichi.Global@zz}'
  • 项目中,学姐提出了一个需求,想在网站登录时可以选择一个年份,项目中所有的数据都有这个年份的筛选,于是便想到挨个修改Mapper层SQL语句实在太麻烦,能不能给Mybatis设置一个全局变量来供所有的SQL使用,这样便能...
  • 如图配置。在上图38行就会可以输出变量啦。

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 595,538
精华内容 238,215
关键字:

xml使用變量