化石原创文章,转载请注明来源并保留原文链接


使用properties配置log4j2

1、配置文件(使用properties文件)

a) 放置log4j.properties到工程的根目录
b) 代码里指定该log4j.properties文件

String currentDirectory = System.getProperty("user.dir");
System.setProperty("log4j.configurationFile", currentDirectory + File.separator + "log4j.properties");

log4j.properties文件内容:

 status=warn
 name=properties_configuration
 #Give directory path where log files should get stored
 property.basePath=f:\/log\
 appenders=console, rolling
 #ConsoleAppender will print logs on console
 appender.console.type=Console
 appender.console.name=consoleLogger
 appender.console.target=SYSTEM_OUT
 appender.console.layout.type=PatternLayout
 #Specify the pattern of the logs
 appender.console.layout.pattern=%d{yyyy-MM-dd HH:mm:ss.SSS} %level [%t] [%c] [%M] [%l] - %msg%n
 #RollingFileAppender will print logs in file which can be rotated based on time or size
 appender.rolling.type=RollingFile
 appender.rolling.name=fileLogger
 appender.rolling.fileName=${basePath}app.log
 appender.rolling.filePattern=${basePath}app_%d{yyyyMMdd}.log.gz
 appender.rolling.layout.type=PatternLayout
 appender.rolling.layout.pattern=%d{yyyy-MM-dd HH:mm:ss.SSS} %level [%t] [%c] [%M] [%l] - %msg%n
 appender.rolling.policies.type=Policies
 #Rotate log file each day and keep 30 days worth
 appender.rolling.policies.time.type=TimeBasedTriggeringPolicy
 appender.rolling.policies.time.interval=1
 appender.rolling.policies.time.modulate=true
 appender.rolling.strategy.type=DefaultRolloverStrategy
 appender.rolling.strategy.delete.type=Delete
 appender.rolling.strategy.delete.basePath=${basePath}
 appender.rolling.strategy.delete.maxDepth=1
 appender.rolling.strategy.delete.ifLastModified.type=IfLastModified
 #Delete files older than 30 days
 appender.rolling.strategy.delete.ifLastModified.age=30d
 #Configure root logger for logging error logs in classes which are in package other than above specified package
 #level: ALL < TRACE < DEBUG < INFO < WARN < ERROR < FATAL < OFF
 rootLogger.level=all
 rootLogger.additivity=false
 rootLogger.appenderRef.rolling.ref=fileLogger
 rootLogger.appenderRef.console.ref=consoleLogger

2、代码得到logger句柄

import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
Logger logger = LogManager.getLogger(name);

3、具体使用

logger.debug(info);
logger.info(info);
logger.warn(info);
logger.error(info);
logger.trace(info);
logger.fatal(info);

使用上面的配置和方法,可以在文件(按上面log4j.properties的配置,在f:/log/app.log中)里和intellij的Console里输出debug、info、warn、error、trace、fatal信息。如果要控制输出的信息,可以在log4.properties文件的最后的部分改动:

rootLogger.level = xxx,比如 rootLogger.level = debug

注:

1、上面的例子代码中因为我们指定的代码是主程序的class的名字,在log4j.properties文件中找不到该名字的logger,所以log4j2会使用rootLogger这个默认的logger。

2、PatternLayout的手册在:

https://logging.apache.org/log4j/2.x/manual/layouts.html


化石原创文章,转载请注明来源并保留原文链接



化石原创文章,转载请注明来源并保留原文链接


使用intellij,默认的是国外的服务器,很多时候会下载不到资源。所以还是配置一下阿里云的仓库。

分两个步骤:

1、maven软件的settings修改

该文件名字:settings.xml,路径在maven安装目录的conf文件夹下。打开后,在<mirrors>下加入内容:

<mirror>
  <id>alimaven</id>
  <name>aliyun maven</name>
  <url>http://maven.aliyun.com/nexus/content/groups/public/</url>
  <mirrorOf>central</mirrorOf>        
</mirror>

2、intellij工程的pom.xml修改。下面是一个完整的pom内容,repositories里的相关内容就是需要添加的。

<?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>org.knk</groupId>
    <artifactId>webcrawl</artifactId>
    <version>1.0-SNAPSHOT</version>

    <repositories>
        <repository>
            <id>alimaven</id>
            <name>aliyun maven</name>
            <url>http://maven.aliyun.com/nexus/content/groups/public/</url>
            <releases>
                <enabled>true</enabled>
            </releases>
            <snapshots>
                <enabled>false</enabled>
            </snapshots>
        </repository>
    </repositories>

    <dependencies>
        <dependency>
            <groupId>org.mongodb</groupId>
            <artifactId>mongodb-driver</artifactId>
            <version>3.11.2</version>
        </dependency>
        <dependency>
            <groupId>org.jsoup</groupId>
            <artifactId>jsoup</artifactId>
            <version>1.12.1</version>
        </dependency>
        <dependency>
            <groupId>org.apache.httpcomponents</groupId>
            <artifactId>httpclient</artifactId>
            <version>4.5.10</version>
        </dependency>
        <dependency>
            <groupId>dom4j</groupId>
            <artifactId>dom4j</artifactId>
            <version>1.6.1</version>
        </dependency>
    </dependencies>
</project>

化石原创文章,转载请注明来源并保留原文链接



化石原创文章,转载请注明来源并保留原文链接


使用java的apache HttpClient做一个小东西,发现200多个html连接后,后续的就没有反应了:没有exception、没有error。

第一反应就是以前在C#遇到的差不多问题,HttpClient内部应该有设置连接的最大数量。不过暂时没去查该东西怎么设置,应该在自己的代码中,并没有关闭每个连接,所以应该在原来的每个html工作程序中先关闭连接。

所以,代码开始和关闭如此:

string url = “xxx”;
CloseableHttpClient httpClient = HttpClients.createDefault();
HttpGet request = new HttpGet(url);
CloseableHttpResponse response = httpClient.execute(request);

response.close();
httpClient.close();

使用上response.close()以后,原来的问题就解决了。


化石原创文章,转载请注明来源并保留原文链接



化石原创文章,转载请注明来源并保留原文链接


今日看到一个非常方便的图片展示库(javascript)。支持马赛克方式、网格方式、格式化方式、瀑布方式。

一个例子:

<html>

<head>
    <meta name="viewport" content="user-scalable=no, width=device-width, initial-scale=1, maximum-scale=1">

    <!-- jQuery -->
    <script src="dist/jquery.min.js" type="text/javascript"></script>

    <!-- nanogallery2 -->
    <link href="dist/css/nanogallery2.min.css" rel="stylesheet" type="text/css">
    <script type="text/javascript" src="dist/jquery.nanogallery2.min.js"></script>
</head>

<body>

    <h1>gallery made with nanogallery2</h1>

    <!-- ### position of the gallery ### -->
    <div id="nanogallery2" style="width: 600px;">gallery_made_with_nanogallery2</div>

    <script>
        jQuery(document).ready(function () {

            jQuery("#nanogallery2").nanogallery2({
                // ### gallery settings ### 
                thumbnailHeight: 200,
                thumbnailWidth: "auto",
                itemsBaseURL: 'image/',

                // ### gallery content ### 
                items: [
                    { src: 'alpha.jpg', srct: 'alpha.jpg', title: 'alpha' },
                    { src: 'BMW.png', srct: 'BMW.png', title: 'BMW' },
                    { src: 'baojun.jpg', srct: 'baojun.jpg', title: 'baojun' },
                    { src: 'Buick.png', srct: 'Buick.png', title: 'Buick' },
                    { src: 'Cadillac.png', srct: 'Cadillac.png', title: 'Cadillac' },
                    { src: 'Chevrolet.png', srct: 'Chevrolet.png', title: 'Chevrolet' },
                    { src: 'Ford.png', srct: 'Ford.png', title: 'Ford' },
                    { src: 'geruisi.jpg', srct: 'geruisi.jpg', title: 'Ford' },
                ]
            });
        });
    </script>

</body>

</html>

可以运行的demo工程:

https://github.com/jycgame/nanogallery2_demo


化石原创文章,转载请注明来源并保留原文链接



化石原创文章,转载请注明来源并保留原文链接


使用Vue.js,做列表的时候非常方便,一般只要一个v-for加上相应的模板,就可以为开发者省下巨量的代码时间,比如:

<ul id="newVehicleList" style="background-color: grey; list-style-type: none; padding-left: 0;">
	<template v-for="item in items">
		<li style="width:25%; float:left;">
			<img v-bind:src="item.picture" style="display: block;">
			<button>配置</button>
			<button>详细信息</button>
		</li>
	</template>
</ul>

上面的代码,只要写一个<li>的模版,我们就可以通过代码加入数据,就能控制列表的增加或者减少。

例子中,列表的每个项都是一张图加上两个按钮。这个图的src值需要在数据中得到,因此我们使用了v-bind。然后每个image的真正路径,是数据中的picture数据指定。所有的数据通过Vue的items得到,每个item中必须含有picture字段。对应的Vue代码如下:

$('#newVehicleLayout').load('./view/mainPage/vehicleNew.html', function () {
	var vehicleList = new Vue({
		el: '#newVehicleList',
		data: {
			items: [
				{ message: 'Foo', picture: 'image/baojun.jpg' },
				{ message: 'Foo', picture: 'image/kylin.jpg' },
				{ message: 'Foo', picture: 'image/zhijun.jpg' },
				{ message: 'Foo', picture: 'image/hydai.jpg' },
				{ message: 'Foo', picture: 'image/alpha.jpg' },
				{ message: 'Foo', picture: 'image/geruisi.jpg' },
				{ message: 'Foo', picture: 'image/ix25.jpg' },
				{ message: 'Foo', picture: 'image/baojun.jpg' },
			],
		}
	});
});

化石原创文章,转载请注明来源并保留原文链接