我使用以下 log4j2 配置:
<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="WARN">
<Appenders>
<Console name="Console" target="SYSTEM_OUT">
<PatternLayout pattern="%d{HH:mm:ss.SSS} %-5.5level %-60.60logger - %msg%n" />
<Filters>
<ThresholdFilter level="info" onMatch="ACCEPT"
onMismatch="DENY" />
</Filters>
</Console>
<RollingFile name="RollingFile"
fileName="${sys:log.file}"
filePattern="${sys:log.parent.path}\$${date:yyyy-MM}\${sys:log.file.name}-%d{MM-dd-yyyy}-%i.log.gz">
<PatternLayout>
<Pattern>
%d{yyy-MM-dd HH:mm:ss.SSS} [%30.30t]%-10.10level%-60.60logger - %msg%n
</Pattern>
</PatternLayout>
<Policies>
<TimeBasedTriggeringPolicy />
<SizeBasedTriggeringPolicy size="60 MB" />
</Policies>
</RollingFile>
</Appenders>
<Loggers>
<Root level="trace">
<AppenderRef ref="RollingFile" />
<AppenderRef ref="Console" />
</Root>
</Loggers>
</Configuration>
Run Code Online (Sandbox Code Playgroud)
当文件位置作为命令行参数传递时,系统参数被设置,然后函数 reconfigureLog() 设置属性
public static void reconfigureLog(String logPath)
{
File logFile = new File(logPath);
System.setProperty("log.file", logPath);
System.setProperty("log.parent.path", logFile.getParent()); …Run Code Online (Sandbox Code Playgroud) 我有一个文件可以具有日期修改值,具有日期或日期时间的格式.我曾经将值解析为:
String t = "2012-01-05T21:21:52.834Z";
logger.info(ZonedDateTime.parse(t).toEpochSecond() * 1000);
Run Code Online (Sandbox Code Playgroud)
现在,字符串也可以
t = "2012-01-05";
Run Code Online (Sandbox Code Playgroud)
哪个引起了错误
线程"main"中的异常java.time.format.DateTimeParseException:无法在java.time.format.DateTimeFormatter.parseResolved0(未知来源)的索引10处解析文本"2012-01-05"
如果我用这个字符串(参考)
LocalDate date = LocalDate.parse(t, DateTimeFormatter.ISO_DATE);
logger.info(date.atStartOfDay(ZoneId.of("UTC")).toEpochSecond() * 1000);
Run Code Online (Sandbox Code Playgroud)
这会奏效.但是,正如我已经提到的那样,字符串可以是这些类型中的任何一种,我如何识别格式然后相应地得到毫秒?
通读这篇文章,我可以像这样过滤集合:
Set<Status> statusClone = cloner.deepClone(statusList).stream().filter(s -> !(s instanceof FileMetadata)).collect(Collectors.toSet());
Run Code Online (Sandbox Code Playgroud)
但是,我还需要设置属性同时过滤它们.过滤后,我目前遍历每个,然后设置属性:
for (Iterator<Status> iterator = statusClone.iterator(); iterator.hasNext();)
{
Status s = iterator.next();
// if (s instanceof FileMetadata)
// {
// iterator.remove();
// continue;
// }
s.setStatus(JobStatus.UNINITIATED);
s.setLastAccessedTime(0);
s.setOffSet(null);
s.setStreamNo(null);
}
statusList.addAll(statusClone);
Run Code Online (Sandbox Code Playgroud)
如果不使用foreach,这在Java8中是否可行?
编辑:从评论,我同意我可以在过滤器内克隆.谢谢.
我正在阅读这篇文章以实现表的记录级版本控制。我注意到该架构涉及历史表的使用。但是,我的场景不需要回滚,而是检索时间点记录。这是我尝试使用单个表进行版本控制的设计。请注意,这是一个简单的表数据(没有约束、索引等)。我打算基于 id 建立索引,因为这涉及列上的 group by 子句。
例如,我有一个表 Test ,其中
id 是标识符,
modstamp 是数据的时间戳(绝不为空)
除了上面的列外,该表还将包含簿记列
local_modstamp 是更新记录的时间戳
del_modstamp 是删除记录的时间戳
在备份期间,所有记录均从源获取并插入到记录具有值 local_modstamp = null 和 del_stamp = null 的位置。
id |modstamp |local_modstamp |del_modstamp |
---|---------------------------|---------------|-------------|
1 |2016-08-01 15:35:32 +00:00 | | |
2 |2016-07-29 13:39:45 +00:00 | | |
3 |2016-07-21 10:15:09 +00:00 | | |
Run Code Online (Sandbox Code Playgroud)
获得记录后,处理数据的场景如下(假设参考时间[ref_time]是进程运行的时间):
正常插入。
更新:使用 local_modstamp = ref_time 更新最新记录。然后插入新记录。查询将是:更新测试集 local_modstamp = 其中 id = 且 local_modstamp 不为空且 del_modstamp 不为空 插入测试值(...)
删除:用 del_modstamp = ref_time …