精华内容
下载资源
问答
  • shell脚本打印日志方法

    万次阅读 2015-11-24 22:02:16
    作者:【吴业亮】云计算开发工程师 博客:http://blog.csdn.net/wylfengyujiancheng在shell...下面介绍日志打印方法example 1 调用log_info函数,如果希望只记录相关信息,不对命令执行结果进行判断 判断/etc/pass

    作者:【吴业亮】
    博客:http://blog.csdn.net/wylfengyujiancheng

    在shell脚本执行过程中如果没有日志记录,特别是脚本比较长的情况下在执行完再定位问题很难发现问题原因,因此在脚本中增加日志显得十分重要。如何在日志中记录是哪个用户什么时间执行的哪个脚本,执行结果又是什么呢?下面介绍日志打印方法

    example 1
    调用log_info函数,如果希望只记录相关信息,不对命令执行结果进行判断
    判断/etc/passwd是否存在,如果存在就记录一条日志“/etc/passwd is exist.”

    
    if [ -f  /etc/passwd  ]
    then 
    	echo -e "\033[32m /etc/passwd is exit \033[0m"
    	log_info "/etc/passwd is exist."	
    fi
    

    example 2
    调用fn_log函数,如果命令执行成功就回显绿色信息,失败回显红色信息。并在日志中记录成功或失败信息。

    rm -f /tmp/messages &&  cp -a /var/log/messages  /tmp
    fn_log "rm -rf /tmp/message &&  cp -a /var/log/message  /tmp"
    
    ping -c 3 10.10.10.10 
    fn_log "ping -c 3 10.10.10.10 "
    

    这里写图片描述

    example 3
    如果脚本在执行过程中用户按了CTR+C 终止脚本执行,回显“DO NOT SEND CTR + C WHEN EXECUTE SCRIPT !!!”,并在日志中记录。
    这里写图片描述
    记录日志函数代码如下:

    #!/bin/bash
    #log path is /var/log/openstack-kilo
    #if commod execute sucessed,it will return 0 else return 1
    # Copyright 2014 Intel Corporation, All Rights Reserved.
    function log_info ()
    {
    if [  -d /var/log  ]
    then
    	mkdir -p /var/log 
    fi
    
    DATE_N=`date "+%Y-%m-%d %H:%M:%S"`
    USER_N=`whoami`
    echo "${DATE_N} ${USER_N} execute $0 [INFO] $@" >>/var/log/openstack-kilo #执行成功日志打印路径
    
    }
    
    function log_error ()
    {
    DATE_N=`date "+%Y-%m-%d %H:%M:%S"`
    USER_N=`whoami`
    echo -e "\033[41;37m ${DATE_N} ${USER_N} execute $0 [ERROR] $@ \033[0m"  >>/var/log/openstack-kilo #执行失败日志打印路径
    
    }
    
    function fn_log ()  {
    if [  $? -eq 0  ]
    then
    	log_info "$@ sucessed."
    	echo -e "\033[32m $@ sucessed. \033[0m"
    else
    	log_error "$@ failed."
    	echo -e "\033[41;37m $@ failed. \033[0m"
    	exit 1
    fi
    }
    trap 'fn_log "DO NOT SEND CTR + C WHEN EXECUTE SCRIPT !!!! "'  2
    
    
    展开全文
  • 线程池执行异常不打印日志

    千次阅读 2020-06-07 16:43:07
    平时自己在使用的ThreadPoolExecutor的时候,提交任务用submit和execute方法用的比较随意,知道当需要获取返回结果的时候用submit。但当并不需要结果的时候submit和execute用得比较随意。在一次使用submit的时候并...

    背景


    平时自己在使用的ThreadPoolExecutor的时候,提交任务用submit和execute方法用的比较随意,知道当需要获取返回结果的时候用submit。但当并不需要结果的时候submit和execute用得比较随意。在一次使用submit的时候并没有获得预期结果,但也没有异常日志输出。在进行一波调试之后,任务在线程中出现异常了,但也并未出现异常抛出的情况。

    代码测试


    1、先用execute 查看当出现异常的情况

    public class ThreadPoolTest {
    
    
    
        private static ThreadPoolExecutor executor = new ThreadPoolExecutor(5, 10, 10L, TimeUnit.SECONDS, new LinkedBlockingQueue<>(500),
                new ThreadFactory() {
                    @Override
                    public Thread newThread(Runnable r) {
                        Thread thread = new Thread(r);
                        thread.setName("submit-execute-test");
                        return thread;
                    }
    
    
                }
        );
    
        private static DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss SSS");
    
        public static void main(String[] args) {
            Random random = new Random();
            for (int i = 0; i < 10; i++) {
                int j = i;
                executor.execute(new Runnable() {
                    @Override
                    public void run() {
                        try {
                            TimeUnit.SECONDS.sleep(2 + random.nextInt(5));
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                        if (j % 2 != 0) {
                            throw new RuntimeException("线程错误");
                        }
                        LinkedBlockingQueue<Runnable> queue = (LinkedBlockingQueue) executor.getQueue();
                        System.out.println(formatter.format(LocalDateTime.now()) + "::" + Thread.currentThread().getName() + "::" +
                                "核心线程数 :" + executor.getCorePoolSize() +
                                "::最大线程数 :" + executor.getMaximumPoolSize() +
                                "::活动线程数 :" + executor.getActiveCount() +
                                "::任务完成数" + executor.getCompletedTaskCount() +
                                "::队列使用 :" + queue.size() + "::队列未使用 :" + queue.remainingCapacity() + "::队列总共大小 :" + (queue.size() + queue.remainingCapacity()));
    
    
                    }
                });
    
            }
        }
    }
    

    在这里插入图片描述
    从打印中可以看到当execute提交runable的时候异常会输出。

    2、我们将execute 换成submit ,其他都不变,再次查看运行情况
    在这里插入图片描述

    可以看出除了我们在代码里面输出内容并未抛出异常。

    原因


    查看ThreadPoolExecutor 的submit方法,是将Runable方法进行封装,再交给Executor去execute,这个方法和ThreadPoolExecutor 的execute方法一样

      public Future<?> submit(Runnable task) {
            if (task == null) throw new NullPointerException();
            RunnableFuture<Void> ftask = newTaskFor(task, null);
            execute(ftask);
            return ftask;
        }
    

    newTaskFor 方法是创建FutureTask 对象,那么具体不抛异常应该就在FutureTask的run方法了。

      protected <T> RunnableFuture<T> newTaskFor(Runnable runnable, T value) {
            return new FutureTask<T>(runnable, value);
        }
    

    FutureTask 的run方法,在run方法中对Throwable 异常进行捕获,错误的时候将异常设置到返回结果。执行正常结束,将返回结果set到结果中

     public void run() {
            if (state != NEW ||
                !UNSAFE.compareAndSwapObject(this, runnerOffset,
                                             null, Thread.currentThread()))
                return;
            try {
                Callable<V> c = callable;
                if (c != null && state == NEW) {
                    V result;
                    boolean ran;
                    try {
                        result = c.call();
                        ran = true;
                    } catch (Throwable ex) {
                        result = null;
                        ran = false;
                        //设置异常到返回结构中
                        setException(ex);
                    }
                    //执行正确结束设置返回结果
                    if (ran)
                        set(result);
                }
            } finally {
                // runner must be non-null until state is settled to
                // prevent concurrent calls to run()
                runner = null;
                // state must be re-read after nulling runner to prevent
                // leaked interrupts
                int s = state;
                if (s >= INTERRUPTING)
                    handlePossibleCancellationInterrupt(s);
            }
        }
    

    建议


    根据上面的分析,如果ThreadPoolExecutor 提交任务的时候如果并不关心返回结果最好直接使用ThreadPoolExecutor.execute() 方法。

    展开全文
  • 执行后,无任何反应,无log日志生成,代码: sqluldr2 user=用户名/密码@oracle数据库:1521/client query="select sysdate from dual" head=no file=/home/ioc/SourceQulifier_0_54bb0764b57548d78c51ee...

    执行后,无任何反应,无log日志生成,代码:

    sqluldr2 user=用户名/密码@oracle数据库:1521/client query="select sysdate from dual" head=no file=/home/ioc/SourceQulifier_0_54bb0764b57548d78c51ee88b2cf8d81.dat field=0x01 log=/home/ioc/SourceQulifier_0_54bb0764b57548d78c51ee88b2cf8d81.log charset=utf8 safe=yes
    

    解决方法:

    1.去掉环境变量NLS_LANG;

    2.在执行语句前加上unset NLS_LANG;

    环境变量NLS_LANG介绍ps:

    Oracle提供全球化的支持,通过定义NLS_LANG参数能够让用户用他们自己的语言使用数据库。

    展开全文
  • 最近接口ab压测,发现写接口比较慢,所以需要在日志打印一些sql的执行时间,排查问题。 @Aspect @Component @Log4j2 public class MapperAspect { @AfterReturning("execution(* com.lsj.xcjfs.dao.*Mapper.*...

    最近接口ab压测,发现写接口比较慢,所以需要在日志中打印一些sql的执行时间,排查问题。


    @Aspect
    @Component
    @Log4j2
    public class MapperAspect {
    
        @AfterReturning("execution(* com.lsj.xcjfs.dao.*Mapper.*(..))")
        public void logServiceAccess(JoinPoint joinPoint) {
            log.info("Completed: " + joinPoint);
        }
    
    
        /**
         * 监控com.lsj.xcjfs.dao..*Mapper包及其子包的所有public方法
         */
        @Pointcut("execution(* com.lsj.xcjfs.dao.*Mapper.*(..))")
        private void pointCutMethod() {
        }
    
        /**
         * 声明环绕通知
         *
         * @param pjp
         * @return
         * @throws Throwable
         */
        @Around("pointCutMethod()")
        public Object doAround(ProceedingJoinPoint pjp) throws Throwable {
            long begin = System.nanoTime();
            Object obj = pjp.proceed();
            long end = System.nanoTime();
    
            log.info("调用Mapper方法:{},参数:{},执行耗时:{}纳秒,耗时:{}毫秒",
                    pjp.getSignature().toString(), Arrays.toString(pjp.getArgs()),
                    (end - begin), (end - begin) / 1000000);
            return obj;
        }
    }

     

    展开全文
  • AOP切面实现方法日志打印耗时计算

    千次阅读 2018-04-12 17:40:57
    很简单,通过AOP实现每个方法访问时候统一进行日志打印和耗时计算,相关配置:1、spring配置在spring配置xml文件中设置启用aop &lt;aop:aspectj-autoproxy proxy-target-class="true" /&gt;2、aop...
  • 打算通过spring aop来给springmvc的controller层的方法加日志,进入方法,方法执行完都记录日志,同时记录方法执行的耗时。日志输出级别为debug,通过log4j的分级别输出日志到不同的文件,下面记录下aop拦截的步骤。...
  • Android 微信登录不了(不走回调,无打印日志)” 场景 安卓点击微信登录,成功拉起微信,点击授权登录返回APP,不走回调方法,也没有打印日志。 原因 微信授权登录,找不到包名文件,导致无法正常回调...
  • 类/接口/方法 都支持AOP都是连接点 Joint point 连接点 程序中支持AOP的位置 Pointcut 切点 要增加功能的一组Joint point(连接点) Advice 增强 要添加的新功能 ...
  • 但在测试时会发现方法执行了,但是没有数据返回,接下来会贴出代码,解决问题。 首先,新建文件夹来存放AopTime.java方法,代码如下: @Configuration @Aspect public class AopTime { private Logger logger = ...
  • springboot使用AOP打印日志信息

    千次阅读 2017-12-24 17:03:02
    随着项目功能的一点点增加,打印日志信息就非常必要了,可以帮助我们很快确定哪里出现了问题,这里使用slf4j来打印日志。AOP即面向切面编程,通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术。如果...
  • 为了更好的了解AOP,进行实践,用AOP实现日志输出,记录方法执行时间。 项目总体结构 项目简介;项目采用SpringBoot简单的实现一个访问模块。再用AOP实现此模块的日志输出,记录方法的执行时间。 pom.xml &amp;...
  • 1、问题我们一般很多时候会需要在ubuntu终端上打印当前运行app的日志,我们一般常见的做法是1)、获取包名 打开当前运行的app,然后输入...然后执行如下的命令就可以打印当前运行app的全日志,pidcat.py packageNam...
  • okhttp的灵活而强大的特点之一,就是其提供了一个拦截器接口,使得我们在打印日志时极为方便,并且对我们的接口代码无入侵性。 本篇文章推荐一个okhttp3的日志打印库,无论是使用古老方式来打印日志的,还是使用...
  • springcloud 日志打印调用方法名称

    千次阅读 2018-11-16 17:03:39
    公司新项目用的springcloud框架,之前并没有接触过,在使用的时候,发现consule只打印SQL日志和logger.info();里的内容,并没有我想要的东西,比如:调用的是哪个方法,用户id等信息,所以从网上找了各种解决方法,...
  • 在进行Android程序的逆向分析的时候,经常需要Android程序的静态分析和动态调试的结合,尤其是对一些加固的Android类方法被调用的确认,需要Hook java类方法打印java类方法的调用堆栈。有幸在网上看到了这篇文章...
  • Logger打印日志

    万次阅读 多人点赞 2018-03-22 14:14:36
    1. 一个最基本的例子使用Logging框架写Log基本上就三个步骤引入loggerg类和logger工厂类声明logger记录日志下面看一个例子//1. 引入slf4j接口的Logger和LoggerFactoryimport org.slf4j.Logger;import org.slf4j....
  • 对于一个访问量很大的网站来说,日志的输出速度是很快的,同样的代码方法被同时调用是很正常的。 那么现在问题来了,我们如何从日志中来区分每一个会话的日志呢?就是我们发现了一个异常,如何知道在这个异常之前...
  • seleniumWebDriver的API高级应用Log4j打印执行日志11_2 目标:使用Log4j在日志文件中打印执行日志,用于监控和后学调试测试脚本 例如:打开百度网页 操作步骤: 1.新建maven项目,引入selenium包,testNG框架,...
  • 在SQL执行过程前后进行打印SQL执行时间、SQL信息、Mapper信息进行日志打印如下图所示: SqlStatementInterceptor : 实现Interceptor接口,在SQL执行过程前后进行打印SQL实行时间、SQL信息、Mapper信息进行...
  • C#中使用Logger打印日志

    千次阅读 2019-08-19 13:03:45
    1、安装nuget包 NLog 2、获取一个用于当前类的Logger,用于记录日志信息 ...4、执行了上面的语句,实际上是没有任何效果的。因为我们还没有配置日志的输出路径。 配置可参考此地址:https://www.cnblog...
  • 在开发过程中遇到非常奇怪的问题,Yii::log() 方法无效,即使发生... array('log'), 一行被他人错误的注释掉了,解开注释后日志打印恢复正常。 下面记录一下排查方法,顺便了解一下 Yii 框架日志记录原理: 首先...
  • arthas02-arthas执行结果保存日志

    千次阅读 2020-03-08 09:54:50
    arthas执行结果保存日志 1 方式一:命令行开启默认日志 执行结果保存日志 默认情况下arthas执行结果...#### 关闭日志打印 [arthas@44607]$ options save-result false NAME BEFORE-VALUE AFTER-VALUE ------------...
  • 今天用jdbc preparestatement 写sql语句查询,但是在执行的过程中实际查询出的结果和预期的结果不一致,然后就在想有什么办法能够在控制台或者Log4j日志输出最终执行的SQL语句,以便于调试。如果是hibernate可以通过...
  • 用过Spring 的开发者都知道它有两大核心...可以很好的集成日志收集、权限拦截、运行监控等功能。 同时,它对系统也是无入侵的,无须改动其他业务代码,就能达到收集信息的目的,非常赞。 1.在项目中添加AOP引用 ...
  • 记录目的:java main 方法使用HttpClients发送请求不打印debug日志 记录背景: 使用java main方法测试接口响应时间 发现问题: 控制台打印巨多debug日志 解决方法: resources目录下增加logback.xml 备注说明: ...
  • 系统log4j.xml配置好了之后,系统日志级别没有按照预期的执行,控制台大量输出debug日志 debug日志 排查问题可以,但是在生产环境下,打印数量巨大,导致系统IO开销增加,影响系统性能 因此我们要想办法把debug日志...
  • SpringBoot项目打印sql语句日志

    千次阅读 2019-11-08 19:02:25
    SpringBoot项目打印sql语句日志 项目开发时偶尔要看一下运行的sql与自己写的本意是否一致,这里提供一个方法用于日志打印sql: 方法:在application.properties的配置文件里面添加配置: ...即可打印日志信息了。 ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 168,004
精华内容 67,201
关键字:

方法执行后如何打印日志