精华内容
下载资源
问答
  • 日志查询字段
    千次阅读
    2020-05-13 18:07:59

    1.grep命令:cat 1.log | grep key 可以写为: grep key 123.log

    根据字符串查询日志中关键词出现的位置:cat -n 日志文件| grep ‘keyword’

    例:

    cat -n 123.log | grep 'keyword'
    grep 'keyword' 123.log
    

    检索日志,并显示该条日志的前后N(10)行记录:cat 日志文件 | grep -n -B10 -A10 “关键字”

    cat -n 123.log | grep -n -B10 -A10  'keyword'
    

    统计在文件中出现的行数

    grep -o "hello" 123.log | wc -l
    

    2.head和tail

    tail -n 10 日志文件 查询日志尾部最后10行的日志;
    tail -n +10 日志文件 查询10行之后的所有日志;
    head -n 10 日志文件 查询日志文件中的头10行日志;
    head -n -10 日志文件 查询日志文件除了最后10行的其他所有日志;

    更多相关内容
  • 用户操作日志记录字段修改前后值

    千次阅读 2021-01-11 17:34:55
    你可能遇到这样的需求,要详细记录用户的操作日志,像下面这样: 用户张三将年龄从“20”改为“21” 用户张三将爱好从“篮球”改为“足球” 通常,用户可以一次改多个字段,然后一次性保存,这些字段的数据修改...

    你可能遇到这样的需求,要详细记录用户的操作日志,像下面这样:

    用户张三将年龄从“20”改为“21”
    用户张三将爱好从“篮球”改为“足球”

     通常,用户可以一次改多个字段,然后一次性保存,这些字段的数据修改记录要分别保存。

    这样的日志需要知道以下数据:

    1. 用户修改了数据库中什么字段
    2. 这个字段对应的中文名是什么
    3. 这个字段原来的值是什么
    4. 这个字段新值是什么

    这几个问题里,1和4是闭着眼都能搞明白的。

    问题2,字段的中文名可以用一个枚举类把英文和中文对应起来,但是如果字段很多的话,很繁琐,然后想起了注解,对字段添加注解,是否可以获取字段的中文意思呢?

    问题3,这个字段原来的值我们也是知道的,但如何保存呢?我首先想到的是:用户修改时将修改前的旧值和新值从前端一起传过来,但是这样有安全问题,因为用户可以按F12在浏览器修改页面上的旧值,所以需要在修改前从数据库先查询出所有字段的旧值,然后与新值依次对比,从中找到用户修改了哪些字段。

    网上搜索一番,看到这篇文章,得到启示,下面按文章思路实现,并加以改进。

    自定义一个注解类来标注字段对应的中文。

    import java.lang.annotation.ElementType;
    import java.lang.annotation.Retention;
    import java.lang.annotation.RetentionPolicy;
    import java.lang.annotation.Target;
    
    /**
     * 字段中文别名
     * @author test
     */
    @Retention(RetentionPolicy.RUNTIME)
    @Target(ElementType.FIELD)
    public @interface FieldAlias {
        String value() default "";
    }

    然后,类需要记录日志的字段上加注解:

    public class User {
    	
    	private int userId;
    	
    	@FieldAlias("姓名")
    	private String name;
    	
    	@FieldAlias("年龄")
    	private int age;
    	
    	@FieldAlias("爱好")
    	private String hobby;
    	
    	public User(){
    		
    	}
    	
    	public User(int userId, String name, int age) {
    		this.userId = userId;
    		this.name = name;
    		this.age = age;
    	}
    
        // 这里省略get set 方法
    }
    
    /**
     * 两个对象差异-字段新旧值
     * @author test
     */
    public class FieldDiff {
    
    	/**
    	 * 字段英文名
    	 */
    	private String fieldENName;
    	
    	/**
    	 * 字段中文名
    	 */
    	private String fieldCNName;
    	
    	/**
    	 * 旧值
    	 */
    	private Object oldValue;
    	
    	/**
    	 * 新值
    	 */
    	private Object newValue;
    	
    	
    	public FieldDiff(String fieldENName, String fieldCNName, Object oldValue, Object newValue) {
    		this.fieldENName = fieldENName;
    		this.fieldCNName = fieldCNName;
    		this.oldValue = oldValue;
    		this.newValue = newValue;
    	}
    
        // 这里省略get set 方法
    
    	@Override
    	public String toString() {
    		String oldVal = this.oldValue == null ? "" : this.oldValue.toString();
            String newVal = this.newValue == null ? "" : this.newValue.toString();
    		return "将 " + this.fieldCNName + " 从“" + oldVal + "” 修改为 “" + newVal + "”";
    	}
    	
    }
    import java.util.ArrayList;
    import java.util.List;
    
    /**
     * 两个对象差异
     * @author test
     */
    public class BeanDiff {
    
    	/**
    	 * 所有差异字段list
    	 */
    	private List<FieldDiff> fieldDiffList = new ArrayList<>();
    	
    	public void addFieldDiff(FieldDiff fieldDiff) {
    		this.fieldDiffList.add(fieldDiff);
    	}
    
    	public List<FieldDiff> getFieldDiffList() {
    		return fieldDiffList;
    	}
    
    	public void setFieldDiffList(List<FieldDiff> fieldDiffList) {
    		this.fieldDiffList = fieldDiffList;
    	}
    	
    }
    import java.lang.reflect.Field;
    import java.util.ArrayList;
    import java.util.Arrays;
    import java.util.List;
    
    
    /**
     * 实例字段差异比较工具类
     * @author test
     */
    public class BeanCompareUtils {
    	
    	private static final String INCLUDE = "INCLUDE";
    	private static final String EXCLUDE = "EXCLUDE";
    	private static final String FILTER_TYPE = "FILTER_TYPE";
    	private static final String FILTER_ARRAY = "FILTER_ARRAY";
    	
    	// 存放过滤类型及过滤字段数组
    	private static ThreadLocal<Map<String, Object>> threadLocal = new ThreadLocal<>();
    	
    	public static void main(String[] args) {
    		
    		User oldUser = new User(1, "张三", 20);
    		User newUser = new User(2, "李四", 21);
    		oldUser.setMoney(1100.1);
    		newUser.setMoney(2200.52);
    		
    		String[] fieldArray = new String[]{"age","name","hobby"};
    		
    		BeanDiff beanDiff = compareInclude(oldUser, newUser,fieldArray);
    		
    		List<FieldDiff> list = beanDiff.getFieldDiffList();
    		if (list != null && list.size() > 0) {
    			for (int i = 0; i< list.size(); i ++) {
    				FieldDiff fieldDiff = list.get(i);
    				System.out.println(fieldDiff.toString());
    			}
    		}
    	}
    	
    	/**
    	 * bean比较
    	 * @param oldBean
    	 * @param newBean
    	 * @return
    	 */
    	public static BeanDiff compare(Object oldBean, Object newBean) {
    		BeanDiff beanDiff = new BeanDiff();
    		
    		Class oldClass = oldBean.getClass();
    		Class newClass = newBean.getClass();
    		
    		if (oldClass.equals(newClass)) {
    			List<Field> fieldList = new ArrayList<>();
    			fieldList = getCompareFieldList(fieldList, newClass);
    			
    			Map<String, Object> map = threadLocal.get();
    			
    			boolean needInclude = false;
    			boolean needExclude = false;
    			boolean hasArray = false;
    			String[] fieldArray = null;
    			
    			if(map != null) {
    				fieldArray = (String[])map.get(FILTER_ARRAY);
    				String type = (String)map.get(FILTER_TYPE);
    				
    				if (fieldArray != null && fieldArray.length > 0) {
    					// 数组排序
    					Arrays.sort(fieldArray);
    					hasArray = true;
    					
    					if (INCLUDE.equals(type)) {
    						needInclude = true;
    					} else if (EXCLUDE.equals(type)) {
    						needExclude = true;
    					}
    				}
    			}
    			
    			for (int i = 0; i < fieldList.size(); i ++) {
    				Field field = fieldList.get(i);
    				field.setAccessible(true);
    				FieldAlias alias = field.getAnnotation(FieldAlias.class);
    				
    				try {
    					Object oldValue = field.get(oldBean);
    					Object newValue = field.get(newBean);
    					
    					if (hasArray) {
    						// 二分法查找该字段是否被排除或包含
    						int idx = Arrays.binarySearch(fieldArray, field.getName());
    						
    						// 该字段被指定排除或没有指定包含
    						if ((needExclude && idx > -1) || (needInclude && idx < 0)) {
    							continue;
    						}
    					}
    					
    					if (nullableNotEquals(oldValue, newValue)) {
    						FieldDiff fieldDiff = new FieldDiff(field.getName(), alias.value(), oldValue, newValue);
    						
    						// 打印
    						System.out.println(fieldDiff.toString());
    						
    						beanDiff.addFieldDiff(fieldDiff);
    					}
    					
    				} catch (IllegalArgumentException e) {
    					e.printStackTrace();
    				} catch (IllegalAccessException e) {
    					e.printStackTrace();
    				}
    			}
    		}
    		
    		return beanDiff;
    	}
    	
    	/**
    	 * bean比较
    	 * @param oldBean
    	 * @param newBean
    	 * @param includeFieldArray 需要包含的字段
    	 * @return
    	 */
    	public static BeanDiff compareInclude(Object oldBean, Object newBean, String[] includeFieldArray) {
    		Map<String, Object> map = new HashMap<>();
    		map.put(FILTER_TYPE, INCLUDE);
    		map.put(FILTER_ARRAY, includeFieldArray);
    		threadLocal.set(map);
    		
    		return compare(oldBean, newBean);
    	}
    	
    	/**
    	 * bean比较
    	 * @param oldBean
    	 * @param newBean
    	 * @param excludeFieldArray 需要排除的字段
    	 * @return
    	 */
    	public static BeanDiff compareExclude(Object oldBean, Object newBean, String[] excludeFieldArray) {
    		Map<String, Object> map = new HashMap<>();
    		map.put(FILTER_TYPE, EXCLUDE);
    		map.put(FILTER_ARRAY, excludeFieldArray);
    		threadLocal.set(map);
    		
    		return compare(oldBean, newBean);
    	}
    	
    	
    	/**
    	 * 获取需要比较的字段list
    	 * @param fieldList
    	 * @param clazz
    	 * @return
    	 */
    	private static List<Field> getCompareFieldList(List<Field> fieldList, Class clazz) {
    		Field[] fieldArray = clazz.getDeclaredFields();
    		
    		List<Field> list = Arrays.asList(fieldArray);
    		
    		for (int i = 0; i < list.size(); i ++) {
    			Field field = list.get(i);
    			FieldAlias alias = field.getAnnotation(FieldAlias.class);
    			if (alias != null) {
    				fieldList.add(field);
    			}
    		}
    		
    		Class superClass = clazz.getSuperclass();
    		if (superClass != null) {
    			getCompareFieldList(fieldList, superClass);
    		}
    		return fieldList;
    	}
    	
    	
    	/**
    	 * 比较值是否不相等
    	 * @param oldValue
    	 * @param newValue
    	 * @return
    	 */
    	private static boolean nullableNotEquals(Object oldValue, Object newValue) {
    		
    		if (oldValue == null && newValue == null) {
    			return false;
    		}
    
    		if (oldValue != null && oldValue.equals(newValue)) {
    			return false;
    		}
    		
    		if (("".equals(oldValue) && newValue == null) || ("".equals(newValue) && oldValue == null)) {
    			return false;
    		}
    		
    		return true;
    	}
    	
    }

    展开全文
  • linux 查找日志指定字段

    千次阅读 2018-12-06 14:14:00
    进程号 cat ietc-api-wechat.log.201807271100.log|awk '{print 8}' for i in *.log;do grep "params={plateId=" 10,$11}'>>a.txt;done ...

    进程号

    cat ietc-api-wechat.log.201807271100.log|awk '{print 4}'|sort|uniq|grep "http-nio*" ietc-api-wechat.log.201807271100.log grep "http-nio-9000-exec-63" ietc-api-wechat.log.201807271100.log|grep "weixin openId"|head -n 1|awk '{print8}'

    for i in *.log;do grep "params={plateId=" i|awk '{print10,$11}'>>a.txt;done

    展开全文
  • 字段修改记录操作日志的实现

    千次阅读 2021-01-08 15:07:43
    数据敏感字段的修改往往需要记录操作日志,例如客户表中的姓名、身份证等信息,需要系统记录下修改记录,方便以后溯源。 准备工作: 1、在白码低代码开发平台创建一个数据表,根据各自需求添加若干个字段,并准备...

    数据敏感字段的修改往往需要记录操作日志,例如客户表中的姓名、身份证等信息,需要系统记录下修改记录,方便以后溯源。

    准备工作:

    1、在白码低代码开发平台创建一个数据表,根据各自需求添加若干个字段,并准备若干条数据以便测试。


    2、创建一个日志表。添加字段:时间、数据、字段、操作前、操作后、操作人(关联-用户)。


    实现步骤:

    1、新建一个“修改数据表”的功能。


    2、点击功能进入编辑界面,在修改功能的基础上添加一个获取当前用户步骤:点开步骤设置,将id设为查询$$USER。

    3、添加编程步骤。点开步骤的“设置>编程”进入代码编辑界面。


    4、添加修改前数据、修改后数据、当前用户的参数,并在代码中引用。

    5、获取当前时间。
     

       //当前时间
            let date = new Date();
            let YY = date.getFullYear() + '-';
            let MM = (date.getMonth() + 1 < 10 ? '0' + (date.getMonth() + 1) : date.getMonth() + 1) + '-';
            let DD = (date.getDate() + 1 <= 10 ? '0' + date.getDate() : date.getDate()) + ' ';
            let hh = (date.getHours() + 1 <= 10 ? '0' + date.getHours() : date.getHours()) + ':';
            let mm = date.getMinutes() + 1 <= 10 ? '0' + date.getMinutes() : date.getMinutes();
            let time=YY+MM+DD+hh+mm;

    6、添加数据表中需要记录修改操作的字段id数据。

       //数据表字段id
            let fields = [
                    "5ff44e3fdd9ec8350b2d24df",//字段1,
                    "5ff44e45cf250d350cc124d2",//字段2,
                    "5ff44e51cf250d350cc124d4",//字段4,
            ];
    


    字段id获取方式为field_数据表>字段名:


    7、添加可根据字段id获取字段名的map
       

      //数据表字段名
            let fieldNameMap = {
                    "5ff44e3fdd9ec8350b2d24df": "字段1",
                    "5ff44e45cf250d350cc124d2": "字段2",
                    "5ff44e51cf250d350cc124d4": "字段4",
            };

    8、是否需要记录字段修改的判断逻辑
          

     fields.forEach(field => {
                    //对每个字段进行判断
                    if (before[field] != after[field]) {
                            //修改前后不相等即有修改,需进行日志记录
    
                    }
            });

    9、创建日志记录

    {
            "5ff44e6ecf250d350cc124d7": time,//时间
            "5ff44e80cf250d350cc124d8": after["5ff44e5ccf250d350cc124d5"],//数据ID
            "5ff44ea0cf250d350cc124d9": fieldNameMap[field],//字段
            "5ff44ea5cf250d350cc124da": before[field],//操作前
            "5ff44eaccf250d350cc124db": after[field],//操作后
            "5ff44eb5cf250d350cc124dc": user._id,//操作人
    }


    10、至此日志功能已全部实现。完整代码:

    async function runProcess($model = model, $plugin = plugin, $params) {
            let before = await $params.before;//修改前的数据
            let after = await $params.after;//修改后的数据
            let user = await $params.user;//当前用户
    
            //当前时间
            let date = new Date();
            let YY = date.getFullYear() + '-';
            let MM = (date.getMonth() + 1 < 10 ? '0' + (date.getMonth() + 1) : date.getMonth() + 1) + '-';
            let DD = (date.getDate() + 1 <= 10 ? '0' + date.getDate() : date.getDate()) + ' ';
            let hh = (date.getHours() + 1 <= 10 ? '0' + date.getHours() : date.getHours()) + ':';
            let mm = date.getMinutes() + 1 <= 10 ? '0' + date.getMinutes() : date.getMinutes();
            let time = YY + MM + DD + hh + mm;
    
            //数据表字段id
            let fields = [
                    "5ff44e3fdd9ec8350b2d24df",//字段1,
                    "5ff44e45cf250d350cc124d2",//字段2,
                    "5ff44e51cf250d350cc124d4",//字段4,
            ];
    
            //数据表字段名
            let fieldNameMap = {
                    "5ff44e3fdd9ec8350b2d24df": "字段1",
                    "5ff44e45cf250d350cc124d2": "字段2",
                    "5ff44e51cf250d350cc124d4": "字段4",
            };
    
            fields.forEach(field => {
                    //对每个字段进行判断
                    if (before[field] != after[field]) {
                            //修改前后不相等即有修改,需进行日志记录
                            $plugin.data.saveData("5ff44e6acf250d350cc124d6", {
                                    "5ff44e6ecf250d350cc124d7": time,//时间
                                    "5ff44e80cf250d350cc124d8": after["5ff44e5ccf250d350cc124d5"],//数据ID
                                    "5ff44ea0cf250d350cc124d9": fieldNameMap[field],//字段
                                    "5ff44ea5cf250d350cc124da": before[field],//操作前
                                    "5ff44eaccf250d350cc124db": after[field],//操作后
                                    "5ff44eb5cf250d350cc124dc": user._id,//操作人
                            });
                    }
            });
    }


    效果:


     

    展开全文
  • 【阿里云】阿里云日志查询语法

    千次阅读 2021-06-08 10:14:16
    阿里云日志查询语法入门
  • 工作中,接口异常等导致线上出问题,可能需要提取异常日志中的一些关键字段,做一些数据分析或处理。shell可帮助快速完成任务。 1. 提取日志字段 sed -n '/validate error/p' error.log|awk -F 'id:' '{print $2...
  • Tomcat 记录访问日志字段详解

    千次阅读 2018-12-24 10:49:30
    默认 tomcat 不记录访问日志,如下方法可以使 tomcat 记录访问日志 编辑 ${catalina}/conf/server.xml 文件. 注 :${catalina} 是 tomcat 的安装目录 把以下的注释 (&lt;!-- --&gt;) 去掉即可。  &lt...
  • ES 处理日志字段超出 1000 引发的报错 ES 集群的日志记录中经常会发现如下报错信息: [2021-02-04T22:40:06,673][DEBUG][o.e.a.a.i.m.p.TransportPutMappingAction] [m-7416] failed to put mappings on indices [[...
  • mysql 查询表 所有字段

    万次阅读 2022-01-07 19:36:36
    mysql 查询表 所有字段 select COLUMN_NAME,column_comment from information_schema.COLUMNS where table_name = 'db_car_apply' -- 查询字段 select COLUMN_NAME from information_schema.COLUMNS where ...
  • Nginx log日志时间字段格式

    千次阅读 2020-09-07 08:56:31
    Nginx log日志是我们大数据分析的重要文件,其中有个时间戳字段,Nginx本身再带了两种类型: $time_local $time_iso8601 展示样式基本为:"04/Sep/2020:18:22:03 +0800" 这种类型,不适合大数据flink或者我们中台...
  • 1.查找日志中某个字段长度最大的记录 假设日志名为:chat.log 日志格式为: |时间|地点|…|消息|字段N| 假设第23个字段是我们想要比较的字段。 通过以下命令筛选: cat chat.log | awk -F '|' '{if(length($23)>...
  • 多字符串多字段查询 在ES中,Query Context 和Filter Context 是两种不同的上下文,其主要区别在于 Query Context 会进行相关性算分 Filter Context,不会进行相关性算分,性能更好 在ES中如果要进行复杂的查询,...
  • 日志查询分析常见报错的解决方法

    千次阅读 2021-07-31 06:12:26
    please add the column in the index attribute索引字段XXX不存在,所以您在查询语句中无法引用该Key。请在查询分析属性中为该字段设置索引,详细说明请参见开启并配置索引,同时打开统计功能。ErrorType:...
  • 关于数据库字段模糊查询

    千次阅读 2019-01-30 11:49:48
    原始需求:数据库中存储了很多微信名称然后得进行模糊查询。 Q1:为什么不进行一对多的设计,可以采用一对多的设计? A:有时候仅仅为了一个属性进行建立一张表,会将表的数量变多,在插入和查询时候进行大量的操作...
  • zabbix自动发现监控日志异常字段

    千次阅读 2019-11-04 14:05:54
    之前也没有做过监控,现在通过读取每个工程的日志来检测异常字段进行报警; 1、先写脚本获取到那个工程的日志文件的绝对路径 cat log_collect.py #!/usr/bin/python3 # -*- coding: utf-8 -*- '''此脚本文件...
  • SLS查询语句是日志服务的专有语法,为了帮助用户简单、快速地构建查询语句,降低用户的学习成本,SLS推出了查询辅助输入(Query Builder)功能,让用户无需关注语法细节也可完成查询。 背景 日志服务(SLS) 日志...
  • 系统日志中敏感字段掩码处理

    千次阅读 2020-05-28 08:24:00
    做为金融业务开发,很多接口都需要使用到用户信息,而在用户信息当中难免会有一些敏感字段,比如:用户姓名,银行卡号等等。所以在用户敏感信息保存以及日志打印的时候就不能把这些敏感信息明文的保存起来。对于...
  • JVM gc打印日志字段说明

    千次阅读 2017-07-03 18:00:39
    minor gc字段说明 full gc字段说明 串行收集器: DefNew:是使用-XX:+UseSerialGC(新生代,老年代都使用串行回收收集器)。 并行收集器: ParNew:是使用-XX:+UseParNewGC(新
  • ACF 优惠券字段 ACF 优惠券字段类型提供了一个方便的只读字段,其中包含根据用户设置自动生成的优惠券代码。 描述 要使用插件,您需要有 ACF 插件。 只需打开这个插件设置,创建一个新的字段集并在字段类型下拉列表...
  • 日志模块包括,提供写文本和写数据库两种模式的基本功能;通过自定义model所需要的字段,记录日志信息; 可以实现记录所需记录的操作、和系统运行过程中出现的异常;
  • 我们在开发的时候,经常要打印日志,有的时候会在一些代码的关键节点处进行日志输出。 使用logback/log4j等原生的日志框架,在日志输出的时候可能会遇到一个问题,那就是在打印对象的时候要求对象必须重写toString...
  • mongodb查询之只查询指定字段

    千次阅读 2019-12-31 14:29:41
    从开始直接使用api去查询,到后面使用DBcursor查询,虽然效率上取得了一旦的效果,但是没有达到预期,最后打日志分析得出,其实查询本身很快了,只是在数据传输的过程中比较慢(由于数据量比较大)。 于是就有了...
  • 查询日志的分析过程

    千次阅读 2021-05-02 03:19:43
    思路:分析慢查询日志-查看表结构、表状态-查看表索引-分析sql语句-explain-修改sql语句-验证修改结果打开慢查询日志在my.cnf置文件中修改log-slow-queries打开慢查询日志long_query_time设一个阀值,要大于这个值才...
  • nginx的log_format日志格式和字段介绍

    万次阅读 2020-08-27 14:45:01
    nginx中access_log记录日志是可以自定义格式的,通过自定义格式,一方面供我们更方便的查询请求,另外还可以做统计,接口访问速度分析等。 语法: log_format name format [format ...] 例如nginx中默认的格式...
  • sql中查询日志表中的数据通过表中的某个字段中的某个值进行筛选SQL select * from sys_log where params like ‘%值%’ and ROWNUM <= 10 ORDER BY create_date desc;
  • Filebeat收集日志数据传输到Redis,通过Logstash来根据日志字段创建不同的ES索引
  • thinkPHP 查询数据库字段

    千次阅读 2017-05-04 17:44:21
    * 查询指定的字段是否存在表中 * @param type $field 字段名称 * @return void * @access protected */ protected function issetField($field){ $fields=$this->model->getDbFields(); return array_search($field,...
  • 如何查询Oracle数据库的操作日志

    千次阅读 2021-05-07 05:12:24
    1、打开oracle sql developer工具,没有此工具的可以去oracle官网下载安装即可,刚刚安装完成的是没有记录的,只有使用工具执行过后才会留下记录可以查询。打开之后不需要连接数据库就可以查询到sql记录了。2、在二...
  • 1、首先了解一下 正则表达式:.*,.*?,.+?的匹配方式 public static void main(String[] args) { String ..."}{"account":"***"}%n 最终在日志里面存在“passwd”和“account”字段的数据值就会被替换成“********”

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 389,382
精华内容 155,752
关键字:

日志查询字段