xml seeprate文件中的连接字符串配置

为了能够为不同的环境配置不同的配置,您可以将配置的连接字符串部分拆分为指向专用于连接字符串的另一个配置文件。 <br/> <br/>这可以用于用主配置引用的自己的配置替换配置文件的任何部分。这允许主配置更小。

web.config
Remove this
 <connectionStrings>
    <clear />    
    <add name="CMSConnectionString" connectionString="Data Source=CREATE-PC-04\SQLSERVER2016;Initial Catalog=alliancecommunity_com_au;Integrated Security=False;Persist Security Info=False;User ID=sa;Password=createnet;Connect Timeout=60;Encrypt=False;Current Language=English;"/>
 </connectionStrings>
  
  And replace it with this
  
<connectionStrings configSource="ConnectionStrings.config" />
  
  Create a new file in the same folder. Name it the same name as the reference i.e. ConnectionStrings.config
  
  Add this to it.
  
<?xml version="1.0"?>
<connectionStrings>
	<clear />
	<add name="CMSConnectionString" connectionString="Data Source=CREATE-PC-04\SQLSERVER2016;Initial Catalog=alliancecommunity_com_au;Integrated Security=False;Persist Security Info=False;User ID=sa;Password=createnet;Connect Timeout=60;Encrypt=False;Current Language=English;" />
</connectionStrings>

  
  

xml 异步适配器

logback.xml
<configuration debug="true">

    <property name="HOME_LOG" value="logs/app.log"/>

    <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
        <layout class="ch.qos.logback.classic.PatternLayout">
            <Pattern>
                %d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n
            </Pattern>
        </layout>
    </appender>

    <appender name="FILE-ROLLING" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>${HOME_LOG}</file>

        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
            <fileNamePattern>logs/archived/app.%d{yyyy-MM-dd}.%i.log</fileNamePattern>
            <!-- each archived file, size max 10MB -->
            <maxFileSize>10MB</maxFileSize>
            <!-- total size of all archive files, if total size > 20GB, it will delete old archived file -->
            <totalSizeCap>20GB</totalSizeCap>
            <!-- 60 days to keep -->
            <maxHistory>60</maxHistory>
        </rollingPolicy>

        <encoder>
            <pattern>%d %p %c{1.} [%t] %m%n</pattern>
        </encoder>
    </appender>

    <!-- https://logback.qos.ch/manual/appenders.html#AsyncAppender -->
    <!-- AsyncAppender will drop events of level TRACE, DEBUG and INFO if its queue is 80% full -->
    <appender name="ASYNC" class="ch.qos.logback.classic.AsyncAppender">
        <appender-ref ref="FILE-ROLLING" />
        <!-- defaulr 256 -->
        <queueSize>512</queueSize>
    </appender>

    <logger name="com.mkyong" level="debug" additivity="false">
        <appender-ref ref="ASYNC"/>
        <appender-ref ref="CONSOLE"/>
    </logger>

    <root level="error">
        <appender-ref ref="CONSOLE"/>
    </root>

</configuration>

xml SMTP适配器

logback.xml
<configuration debug="true">

    <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
        <layout class="ch.qos.logback.classic.PatternLayout">
            <Pattern>
                %d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n
            </Pattern>
        </layout>
    </appender>

    <appender name="EMAIL" class="ch.qos.logback.classic.net.SMTPAppender">
        <smtpHost>smtp.mailgun.org</smtpHost>
        <smtpPort>25</smtpPort>
        <username>123</username>
        <password>123</password>
        <to>TO_EMAIL</to>
        <to>RO_ANOTHER_EMAIL</to>
        <from>FROM_EMAIL</from>
        <subject>TESTING: %logger{20} - %m</subject>

        <layout class="ch.qos.logback.classic.html.HTMLLayout"/>

		<!-- for testing , comment in production, default 256 -->
        <cyclicBufferTracker class="ch.qos.logback.core.spi.CyclicBufferTracker">
			<!-- Send just one log entry per email, ready for a lot of emails if you put one. -->
            <bufferSize>1</bufferSize>
        </cyclicBufferTracker>

		<!-- for testing , comment in production, default asynchronousSending = true -->
        <asynchronousSending>false</asynchronousSending>

    </appender>

    <logger name="com.mkyong" level="error" additivity="false">
        <appender-ref ref="EMAIL"/>
    </logger>

    <root level="error">
        <appender-ref ref="CONSOLE"/>
    </root>

</configuration>

xml Rolling File Appender

logback.xml
<configuration>

    <property name="HOME_LOG" value="logs/app.log"/>

    <appender name="FILE-ROLLING" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>${HOME_LOG}</file>

        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
            <fileNamePattern>logs/archived/app.%d{yyyy-MM-dd}.%i.log</fileNamePattern>
            <!-- each archived file, size max 10MB -->
            <maxFileSize>10MB</maxFileSize>
            <!-- total size of all archive files, if total size > 20GB, it will delete old archived file -->
            <totalSizeCap>20GB</totalSizeCap>
            <!-- 60 days to keep -->
            <maxHistory>60</maxHistory>
        </rollingPolicy>

        <encoder>
            <pattern>%d %p %c{1.} [%t] %m%n</pattern>
        </encoder>
    </appender>

    <logger name="com.mkyong" level="debug" additivity="false">
        <appender-ref ref="FILE-ROLLING"/>
    </logger>

    <root level="error">
        <appender-ref ref="FILE-ROLLING"/>
    </root>

</configuration>

xml 文件附加器

logback.xml
<configuration>

    <property name="HOME_LOG" value="logs/app.log"/>

    <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
        <layout class="ch.qos.logback.classic.PatternLayout">
            <Pattern>
                %d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n
            </Pattern>
        </layout>
    </appender>

    <appender name="FILE" class="ch.qos.logback.core.FileAppender">
        <file>${HOME_LOG}</file>
        <append>true</append>
        <immediateFlush>true</immediateFlush>
        <encoder>
            <pattern>%d %p %c{1.} [%t] %m%n</pattern>
        </encoder>
    </appender>

    <logger name="com.mkyong" level="debug" additivity="false">
        <appender-ref ref="CONSOLE"/>
        <appender-ref ref="FILE"/>
    </logger>

    <root level="error">
        <appender-ref ref="CONSOLE"/>
    </root>

</configuration>

xml Apache Commons Digester

Apache Commons Digester

ApacheCommonsDigester.java
import org.apache.commons.digester3.Digester;
import org.xml.sax.SAXException;

import java.io.IOException;
import java.io.InputStream;
import java.util.Objects;
import java.util.ArrayList;
import java.util.List;

public class ApacheCommonsDigester {
    private Foo foo;

    public void setFoo(Foo foo) {
        this.foo = foo;
    }

    public static void main(String[] args) throws IOException, SAXException {
        Main main = new Main();

        Digester digester = new Digester();
        digester.setValidating(false);

        digester.push(main);

        digester.addObjectCreate("foo", Foo.class);
        digester.addSetProperties("foo", "name", "name");
        digester.addSetNext("foo", "setFoo");

        digester.addObjectCreate("foo/bar", Bar.class);
        digester.addSetProperties("foo/bar", new String[]{"id", "title"}, new String[]{"id", "name"});
        digester.addSetNext("foo/bar", "addBar", Bar.class.getSimpleName());

        Object parse = null;
        try (InputStream stream = Main.class.getClassLoader().getResourceAsStream("test.xml")) {
            parse = digester.parse(Objects.requireNonNull(stream));
        } catch (NullPointerException e) {
            return;
        }
//        Foo foo = (Foo) parse;
//        System.out.println(parse);

        System.out.println("MAIN: " + main.foo);
    }
}

class Foo {
    private String name;

    private List<Bar> barList;

    public Foo() {
        this.barList = new ArrayList<>();
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        System.out.println(this + "执行 setName 方法");
        this.name = name;
    }

    public void addBar(Bar bar) {
        System.out.println(this + "执行 addBar 方法");
        this.barList.add(bar);
    }

    @Override
    public String toString() {
        return "Foo{" +
                "name='" + name + '\'' +
                ", barList=" + barList +
                '}';
    }
}

class Bar {
    private Integer id;
    private String name;

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        System.out.println(this + "执行 setId 方法");
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        System.out.println(this + "执行 setName 方法");
        this.name = name;
    }

    @Override
    public String toString() {
        return "Bar{" +
                "id=" + id +
                ", name='" + name + '\'' +
                '}';
    }
}
test.xml
<foo name="The Parent">
    <bar id="123" title="The First Child" />
    <bar id="456" title="The Second Child" />
</foo>

xml 春天缓存哨兵

application.properties
spring.redis.sentinel.master=mymaster
spring.redis.sentinel.nodes=192.168.10.107:26379,192.168.10.107:26380,192.168.10.107:26381
spring.redis.jedis.pool.max-active=100
spring.redis.jedis.pool.max-wait=1000ms
spring.redis.jedis.pool.max-idle=100
spring.redis.password=main
RedisConfig.java
package com.finshope.springbootsentinel.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.cache.RedisCacheConfiguration;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.serializer.GenericJackson2JsonRedisSerializer;
import org.springframework.data.redis.serializer.RedisSerializationContext;

@Configuration
public class RedisConfig {

    @Bean
    public RedisCacheConfiguration redisCacheConfiguration(RedisConnectionFactory factory) {
        RedisCacheConfiguration configuration = RedisCacheConfiguration.defaultCacheConfig();
        configuration = configuration.serializeValuesWith(RedisSerializationContext.SerializationPair.
                fromSerializer(new GenericJackson2JsonRedisSerializer()));
        return configuration;

    }
}
pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.1.6.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.finshope</groupId>
    <artifactId>springbootsentinel</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>springbootsentinel</name>
    <description>Demo project for Spring Boot</description>

    <properties>
        <java.version>1.8</java.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-redis</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-cache</artifactId>
            <version>2.1.6.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-databind</artifactId>
            <version>2.9.9</version>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

</project>

xml 春天的哨兵

applicationContext.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">

    <bean class="redis.clients.jedis.JedisPoolConfig" id="config">
        <property name="testWhileIdle" value="true"/>
        <property name="testOnReturn" value="false"/>
        <property name="testOnBorrow" value="false"/>
        <property name="maxIdle" value="100"/>
        <property name="maxWaitMillis" value="1000"/>
    </bean>

    <bean class="org.springframework.data.redis.core.RedisTemplate">
        <property name="connectionFactory" ref="factory"/>
        <property name="keySerializer">
            <bean class="org.springframework.data.redis.serializer.StringRedisSerializer"></bean>
        </property>
        <property name="valueSerializer">
            <bean class="org.springframework.data.redis.serializer.GenericJackson2JsonRedisSerializer"/>
        </property>
    </bean>

    <bean id="sentinelConfiguration" class="org.springframework.data.redis.connection.RedisSentinelConfiguration">
        <property name="master">
            <bean class="org.springframework.data.redis.connection.RedisNode">
                <property name="name" value="mymaster"/>
            </bean>
        </property>
        <property name="sentinels">
            <set>
                <bean class="org.springframework.data.redis.connection.RedisNode">
                    <constructor-arg name="host" value="192.168.10.107"/>
                    <constructor-arg name="port" value="26379"/>
                </bean>
                <bean class="org.springframework.data.redis.connection.RedisNode">
                    <constructor-arg name="host" value="192.168.10.107"/>
                    <constructor-arg name="port" value="26380"/>
                </bean>
                <bean class="org.springframework.data.redis.connection.RedisNode">
                    <constructor-arg name="host" value="192.168.10.107"/>
                    <constructor-arg name="port" value="26381"/>
                </bean>
            </set>
        </property>
    </bean>

    <bean class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory" id="factory">
        <property name="poolConfig" ref="config"/>
        <property name="usePool" value="true"/>
        <constructor-arg name="sentinelConfig" ref="sentinelConfiguration"/>
        <property name="password" value="main"/>
    </bean>
</beans>
pom.xml
<?xml version="1.0" encoding="UTF-8"?>

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>

  <groupId>com.finshope</groupId>
  <artifactId>sentineldemo</artifactId>
  <version>1.0-SNAPSHOT</version>
  <packaging>war</packaging>

  <name>sentineldemo Maven Webapp</name>
  <!-- FIXME change it to the project's website -->
  <url>http://www.example.com</url>

  <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <maven.compiler.source>1.8</maven.compiler.source>
    <maven.compiler.target>1.8</maven.compiler.target>
  </properties>

  <dependencies>
    <dependency>
      <groupId>org.slf4j</groupId>
      <artifactId>slf4j-api</artifactId>
      <version>1.7.26</version>
    </dependency>
    <dependency>
      <groupId>org.slf4j</groupId>
      <artifactId>slf4j-nop</artifactId>
      <version>1.7.2</version>
    </dependency>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>4.12</version>
      <scope>test</scope>
    </dependency>
    <dependency>
      <groupId>redis.clients</groupId>
      <artifactId>jedis</artifactId>
      <version>2.9.1</version>
    </dependency>
    <dependency>
      <groupId>org.springframework.data</groupId>
      <artifactId>spring-data-redis</artifactId>
      <version>2.0.7.RELEASE</version>
    </dependency>
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-test</artifactId>
      <version>5.1.8.RELEASE</version>
    </dependency>
    <dependency>
      <groupId>com.fasterxml.jackson.core</groupId>
      <artifactId>jackson-databind</artifactId>
      <version>2.9.9</version>
    </dependency>
  </dependencies>

  <build>
    <finalName>sentineldemo</finalName>
    <pluginManagement><!-- lock down plugins versions to avoid using Maven defaults (may be moved to parent pom) -->
      <plugins>
        <plugin>
          <artifactId>maven-clean-plugin</artifactId>
          <version>3.1.0</version>
        </plugin>
        <!-- see http://maven.apache.org/ref/current/maven-core/default-bindings.html#Plugin_bindings_for_war_packaging -->
        <plugin>
          <artifactId>maven-resources-plugin</artifactId>
          <version>3.0.2</version>
        </plugin>
        <plugin>
          <artifactId>maven-compiler-plugin</artifactId>
          <version>3.8.0</version>
        </plugin>
        <plugin>
          <artifactId>maven-surefire-plugin</artifactId>
          <version>2.22.1</version>
        </plugin>
        <plugin>
          <artifactId>maven-war-plugin</artifactId>
          <version>3.2.2</version>
        </plugin>
        <plugin>
          <artifactId>maven-install-plugin</artifactId>
          <version>2.5.2</version>
        </plugin>
        <plugin>
          <artifactId>maven-deploy-plugin</artifactId>
          <version>2.8.2</version>
        </plugin>
      </plugins>
    </pluginManagement>
  </build>
</project>

xml 流利的(td-agent)多段解析器

fluentd_multi_segment_parser.xml
<source>
  @type tail
  path {{ access_log_path }}
  tag log.access
  <parse>
    @type apache2
  </parse>
</source>
<filter log.access>
  @type parser
  key_name path
  <parse>
    @type regexp
    expression /^(?<host>[^ ]*) [^ ]* (?<user>[^ ]*) \[(?<time>[^\]]*)\] "(?<method>\S+)(?: +(?<path>[^ ]*) +\S*)?" (?<code>[^ ]*) (?<size>[^ ]*)$/
    time_format %d/%b/%Y:%H:%M:%S %z
  </parse>
</filter>
<match log.access>
  @type s3
  s3_bucket {{ s3_bucket_name }}
  s3_region ap-northeast-1
  path parsed/%Y/%m/%d/
  time_slice_format %Y%m%d%H%M%S
  time_slice_wait 1m
  <format>
    none
  </format>
  flush_at_shutdown true
</match>

xml Sequrity Groups

groups
<?xml version="1.0" ?>
<odoo>
    <data>
        <record id="requester_module_category" model="ir.module.category">
            <field name="name">Requester</field>
        </record>
        <record id="requester_group_user" model="res.groups">
            <field name="name">User</field>
            <field name="implied_ids" eval="[(4, ref('base.group_user'))]"/>
            <field name="users" eval="[(4, ref('base.user_root'))]"/>
            <field name="category_id" ref="requester_module.requester_module_category"/>
        </record>

        <record id="requester_group_manager_two" model="res.groups">
            <field name="name">Manager</field>
            <field name="implied_ids" eval="[(4, ref('requester_module.requester_group_user'))]"/>
            <field name="category_id" ref="requester_module.requester_module_category"/>
        </record>


    </data>

</odoo>