精华内容
下载资源
问答
  • Gson解析遇到异常分析与记录

    千次阅读 2020-05-06 19:45:08
    在使用Gson解析api响应结果的字符串时遇到两个非常奇怪的报错,一开始以为是json字符串不规范引起的,后经排查与InputStreamReader接收有直接关系。 MalformedJsonException 报错 ...

    在使用Gson解析api响应结果的字符串时遇到两个非常奇怪的报错,一开始以为是json字符串不规范引起的,后经排查与InputStreamReader接收有直接关系。

    MalformedJsonException

    报错
    com.google.gson.JsonSyntaxException: com.google.gson.stream.MalformedJsonException: Use JsonReader.setLenient(true) to accept malformed JSON at line 1 column 66 path $
    解决方案
    使用gson解析时,默认情况下将会以严格模式对json字符串进行解析,
    在gson实例创建时,进行setLenient()就能对部分不符合json规范要求的字符串解析

    private static Gson gson = new GsonBuilder().serializeNulls()
                                                .serializeSpecialFloatingPointValues()
                                                .disableHtmlEscaping()
                                                .setLenient()
                                                .create();
    

    以上异常不再报错后,出现了另外的异常错误:JsonIOException

    JsonIOException

    报错
    com.google.gson.JsonIOException: JSON document was not fully consumed
    解决方案
    使用BufferedReader替换InputStreamReader处理http请求响应结果的输入流。
    解决方案有效的前提
    针对使用http-client相关的jar包进行http请求返回的响应对象json结构(笔者使用了java自带的HttpURLConnection网络编程类进行请求)
    同类错误的参考
    错误解决参考链接:com.google.gson.JsonIOException: JSON document was not fully consumed.
    解决排查过程
    重新检查需要解析的字符串,由http请求返回json结构(该结果通过debug模式调试单独复制出来)

    {"Ret":0,"ErrCode":0,"ErrMsg":"OK","StackTrace":"","Data":false}
    

    初步看起来并没有什么问题,也不觉得这是一个会引起解析异常的字符串。
    该json字符串是调用第三方api后返回的,只是使用使用了InputStreamReader方式来接收响应结果,如下:

    /** conn为HttpURLConnection实例 **/
    public static String getRequest(String url, boolean withProxy){
            HttpURLConnection conn = null;
            try {
                conn = connWrapper(url, "GET", withProxy);
    
                // 导致问题关键 -- InputStreamReader获取响应结果,有可能造成gson解析时错误
                Reader reader = new InputStreamReader(conn.getInputStream());
                char[] buff = new char[512];
                StringBuffer strBuff = new StringBuffer();
                while (reader.read(buff) != -1) {
                    strBuff.append(buff);
                }
                reader.close();
    
                return strBuff.toString();
    
            } catch(IOException e){
                e.printStackTrace();
            } finally{
                if (conn != null) conn.disconnect();
            }
    
            return "";
        }
    

    更新后为BufferedReader处理方式:

    public static String getRequest(String url, boolean withProxy){
    
            HttpURLConnection conn = null;
            try {
                conn = connWrapper(url, "GET", withProxy);
    			
    			// 解决问题关键 -- 使用BufferedReader获取响应结果
                BufferedReader reader = new BufferedReader(new InputStreamReader(conn.getInputStream()));
                String line;
                StringBuffer strBuff = new StringBuffer();
                while ((line = reader.readLine()) != null) {
                    strBuff.append(line);
                }
                reader.close();
    
                return strBuff.toString();
    
            } catch(IOException e){
                e.printStackTrace();
            } finally{
                if (conn != null) conn.disconnect();
            }
    
            return "";
        }
    

    替换后即可正常解析字符串。

    展开全文
  • 服务器端JSON开发中遇到异常解析

    千次阅读 2013-08-24 18:59:29
    1、就是我们在做开发的时候,信所遇到异常信息当中,已经将我们需要的东西全都告诉给我们了,我们只需要根据日志,仔细的分析即可解决问题。 2、从日志中我们可以分析出我们找不到的类是在org.apache这个开源...

        最近有很多朋友在做服务端JSON开发的时候遇到各种各样的异常,尤其是NoClassDefFoundError异常屡改不绝,他们经过在工程里面反复查找,没有发现有任何相关的错误。于是我将我所遇到的一些最常见的异常列举出来,方便大家及时的解决问题,节约时间。

    1、我们在刚开始进行JSON开发的时候,必须导入一个json-bin的jar包,如果不导入这个包,我们经常使用的JSON,JSONObject,JSONArray,JSONSerializer等类将无法正常使用,工程里面将找不到相应的类。我在此使用的是myeclipse,所以只需要将此包在放在lib文件夹下即可。

    2、我们新建一个web工程,编写好一段代码,例如:

    编写一个bean文件Person.java,里面包含三个字段,int id,String name,string address。并重构其相关方法。

    编写一个JSONServer.java,并且在里面添加如下一段代码:

    	public static Person getPerson(){
    		//在此我们构造一个person对象,并且返回给调用者。
    		Person person = new Person(1, "amir", "chengdu");
    		return person;
    	}


    编写一个JSONTools.java,并且在里面添加如下一段代码:

    	public static String createJsonString(String key, Object value){
    		//由于我们这个地方使用的是object,也就是说json处理的是对象,所以我们传入的是一个person对象
    		JSONObject object = new JSONObject();
    		object.put(key, value);
    		return object.toString();
    	}

    最后在main方法当中,我们做如下测试:

    	public static void main(String[] args) {
    		// TODO Auto-generated method stub
    		String msg = "";
    		//测试获取单个person
    		Person p = JsonService.getPerson();
    		msg = JSONTools.createJsonString("person", p);
    		System.out.println(msg);
    	}
    此时我们的代码已经写完,而且工程当中没有任何错误,真所谓万事俱备只欠东风了,于是我们运行一下看看会出现什么情况?


    Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/commons/lang/exception/NestableRuntimeException

    at java.lang.ClassLoader.defineClass1(Native Method)

    at java.lang.ClassLoader.defineClass(ClassLoader.java:621)

    at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:124)

    at java.net.URLClassLoader.defineClass(URLClassLoader.java:260)

    at java.net.URLClassLoader.access$000(URLClassLoader.java:56)

    at java.net.URLClassLoader$1.run(URLClassLoader.java:195)

    at java.security.AccessController.doPrivileged(Native Method)

    at java.net.URLClassLoader.findClass(URLClassLoader.java:188)

    at java.lang.ClassLoader.loadClass(ClassLoader.java:307)

    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301)

    at java.lang.ClassLoader.loadClass(ClassLoader.java:252)

    at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:320)

    at com.json.tools.JSONTools.createJsonString(JSONTools.java:17)

    at com.json.test.TestJson.main(TestJson.java:20)

    Caused by: java.lang.ClassNotFoundExceptionorg.apache.commons.lang.exception.NestableRuntimeException

    at java.net.URLClassLoader$1.run(URLClassLoader.java:200)

    at java.security.AccessController.doPrivileged(Native Method)

    at java.net.URLClassLoader.findClass(URLClassLoader.java:188)

    at java.lang.ClassLoader.loadClass(ClassLoader.java:307)

    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301)

    at java.lang.ClassLoader.loadClass(ClassLoader.java:252)

    at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:320)


    对,你猜对了,出现异常了。首先我们从第一行可以分析到java.lang.NoClassDefFoundError。这个是由于没有相应类所引发的异常,也就是找不到类了。具体是找不到哪个类了呢,我们可以从这句话中看出:

    Caused by: java.lang.ClassNotFoundExceptionorg.apache.commons.lang.exception.NestableRuntimeException

    这句话说得特别明显了,是由于org.apache.commons.lang.exception这个包下面的NestableRuntimeException这个类找不到了。

    这时就需要我们导入一个包:commons-lang-2.6.jar 

    注意了,我使用的是commons-lang的第2.6个版本。现在最新的有一个叫做:commons-lang3-3.1.jar 

    大家看清楚了,我们工程中所报的异常是由于org.apache.commons.lang这个包下面的,而在commons-lang3-3.1.jar 里面的包名却是这个样子的org.apache.commons.lang3。其实我们从文件名上就可以看出,这个最新的是commons-lang3的第3.1个版本。


    好了,导入上面那个包后我们再运行一下看看又会出现什么情况?

    Exception in thread "main" java.lang.NoClassDefFoundError: net/sf/ezmorph/Morpher

    at com.json.tools.JSONTools.createJsonString(JSONTools.java:18)

    at com.json.test.TestJson.main(TestJson.java:21)

    Caused by: java.lang.ClassNotFoundException: net.sf.ezmorph.Morpher

    at java.net.URLClassLoader$1.run(URLClassLoader.java:200)

    at java.security.AccessController.doPrivileged(Native Method)

    at java.net.URLClassLoader.findClass(URLClassLoader.java:188)

    at java.lang.ClassLoader.loadClass(ClassLoader.java:307)

    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301)

    at java.lang.ClassLoader.loadClass(ClassLoader.java:252)

    at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:320)

    ... 2 more


    没错,又出异常了,虽然还是因为找不到类而报的异常,但此时的异常有一些不一样:

    对,你肯定猜到了,还是由于少导入了些包而引起的,这里是由于缺少net.sf.ezmorph.Morpher这个类而引起的。

    我们只需要下载如下包即可解决此问题:ezmorph-1.0.6.jar


    来,我们继续运行:

    Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/commons/logging/LogFactory

    at net.sf.json.AbstractJSON.<clinit>(AbstractJSON.java:53)

    at com.json.tools.JSONTools.createJsonString(JSONTools.java:18)

    at com.json.test.TestJson.main(TestJson.java:21)

    Caused by: java.lang.ClassNotFoundException: org.apache.commons.logging.LogFactory

    at java.net.URLClassLoader$1.run(URLClassLoader.java:200)

    at java.security.AccessController.doPrivileged(Native Method)

    at java.net.URLClassLoader.findClass(URLClassLoader.java:188)

    at java.lang.ClassLoader.loadClass(ClassLoader.java:307)

    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301)

    at java.lang.ClassLoader.loadClass(ClassLoader.java:252)

    at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:320)

    ... 3 more


    不用多说,会分析日志的人都看得出来,这里是由于缺少org.apache.commons.logging.LogFactory这个类而引起的。

    我们只需要下载如下包即可解决此问题:commons-logging-1.1.3.jar


    来,我们继续运行:


    Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/commons/collections/map/ListOrderedMap

    at net.sf.json.JSONObject.<init>(JSONObject.java:1450)

    at com.json.tools.JSONTools.createJsonString(JSONTools.java:18)

    at com.json.test.TestJson.main(TestJson.java:21)

    Caused by: java.lang.ClassNotFoundException: org.apache.commons.collections.map.ListOrderedMap

    at java.net.URLClassLoader$1.run(URLClassLoader.java:200)

    at java.security.AccessController.doPrivileged(Native Method)

    at java.net.URLClassLoader.findClass(URLClassLoader.java:188)

    at java.lang.ClassLoader.loadClass(ClassLoader.java:307)

    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301)

    at java.lang.ClassLoader.loadClass(ClassLoader.java:252)

    at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:320)

    ... 3 more


    这里是由于缺少org.apache.commons.collections.map.ListOrderedMap这个类而引起的。

    我们只需要下载如下包即可解决此问题:commons-collections-3.2.1-bin.zip

    在这里我们也需要注意不要导入类似于这样的包:commons-collections4-4.0-alpha1-bin.zip


    来,我们继续运行:


    Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/commons/beanutils/DynaBean

    at net.sf.json.AbstractJSON._processValue(AbstractJSON.java:230)

    at net.sf.json.JSONObject._processValue(JSONObject.java:2655)

    at net.sf.json.JSONObject.processValue(JSONObject.java:2721)

    at net.sf.json.JSONObject.element(JSONObject.java:1786)

    at net.sf.json.JSONObject.element(JSONObject.java:1764)

    at net.sf.json.JSONObject.put(JSONObject.java:2380)

    at com.json.tools.JSONTools.createJsonString(JSONTools.java:19)

    at com.json.test.TestJson.main(TestJson.java:21)

    Caused by: java.lang.ClassNotFoundException: org.apache.commons.beanutils.DynaBean

    at java.net.URLClassLoader$1.run(URLClassLoader.java:200)

    at java.security.AccessController.doPrivileged(Native Method)

    at java.net.URLClassLoader.findClass(URLClassLoader.java:188)

    at java.lang.ClassLoader.loadClass(ClassLoader.java:307)

    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301)

    at java.lang.ClassLoader.loadClass(ClassLoader.java:252)

    at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:320)

    ... 8 more


    这里是由于缺少org.apache.commons.beanutils.DynaBean这个类而引起的。

    我们只需要下载如下包即可解决此问题:来,我们继续运行:commons-beanutils-1.8.3.jar


    来,我们继续运行后控制台打印出了如下一段字符串:

    {"person":{"address":"chengdu","id":1,"name":"amir"}}


    从以上我们可以看出,在我们进行服务器端JSON开发的时候,我们需要用到额外的.jar包有:

    ezmorph-1.0.6.jar 

    commons-logging-1.1.3.jar 

    commons-lang-2.6.jar

    commons-beanutils-1.8.3.jar

    commons-collections-3.2.1.jar

     json-lib-2.4-jdk15.jar

    从上面的日志当中我们可以总结出一些结论:

    1、就是我们在做开发的时候,信所遇到的异常信息当中,已经将我们需要的东西全都告诉给我们了,我们只需要根据日志,仔细的分析即可解决问题。

    2、从日志中我们可以分析出我们找不到的类是在org.apache这个开源项目下,而我们所使用的开发语言java是不包含这一块的,所以我们可以大胆的猜想这是由于缺少某个apache的插件或者引用包而导致的。

    3、就以上面贴出的这么多个异常信息(org.apache.commons.beanutils.DynaBean),我们可以看出所报的异常当中,最后一个是类名,前面是包名,而根据我们所下载的这么多jar文件,使用其包名中的关键字commons、beanutils即可在浏览器中搜索出以对应关键字命名的.jar包。


    以上是小弟的一些想法,读者如有更好的方法或者意见,请与我交流,谢谢。


    作者:Amir

    博客:http://blog.csdn.net/amir_zt/

    以上原创,转载请注明出处,谢谢。

    http://blog.csdn.net/amir_zt/article/details/10260741

    展开全文
  • linux log 日志解析

    万次阅读 2010-12-15 11:19:00
    所以日志文件异常重要,作为一个合格的linux 系统工程师,日志文件是必要熟练掌握的部分。   常见的几个登录文件有: /var/log/secure:记录登入系统存取数据的文件,例如 pop3, ssh, teln

         其实,可以说成是监控系统的记录,系统一举一动基本会记录下来。这样由于信息非常全面很重要,通常只有 root 可以进行视察!通过登录文件(日志文件)可以根据屏幕上面的错误讯息与再配合登录文件的错误信息,几乎就可以解决大部分的 Linux 问题! 所以日志文件异常重要,作为一个合格的linux 系统工程师,日志文件是必要熟练掌握的部分。

     

    常见的几个登录文件有:

    /var/log/secure:记录登入系统存取数据的文件,例如 pop3, ssh, telnet, ftp 等都会被记录;

    /var/log/wtmp:记录登入者的讯息数据,由于本文件已经被编码过,所以必须使用 last指令来取出文件的内容;

    /var/log/messages:尤为重要,几乎发生的错误讯息(或是重要信息)都会被记录在此;

    /var/log/boot.log:记录开机或者是一些服务启动的时候,所显示的启动或关闭讯息;

    /var/log/maillog 或 /var/log/mail/*:纪录邮件存取或往来( sendmail 与 pop3 )的使用者记录;

    /var/log/cron:记录 crontab 这个例行性服务的内容的。

    /var/log/httpd, /var/log/news, /var/log/mysqld.log, /var/log/samba, /var/log/procmail.log:分别是几个不同的网络服务的记录文件!

     

     

    登录文件的纪录程序之一: syslogd

    通常经过 syslog 而记录下来的数据主要有:

    事件发生的日期与时间;

    发生此事件的主机名称;

    启动此事件的服务名称 (如 samba, xinetd 等) 或函式名称 (如 libpam ..);

    该讯息数据内容

     

    syslogd的daemon配置文件:/etc/syslog.conf

    内容语法是这样的:

    服务名称[.=!]讯息等级          讯息记录的文件名或装置或主机

    # 例如底下:

    mail.info                      /var/log/maillog_info

     

    服务名称:该服务产生的讯息会被纪录的意思。syslog 认识的服务主要有底下这些:

    auth, authpriv:主要与认证有关的机制,例如telnet, login, ssh 等需要认证的服务都是使用此一机制;

    cron:例行性命令 cron/at 等产生讯息记录的地方;

    daemon:与各个 daemon 有关的讯息;

    kern:核心 (kernel) 产生讯息的地方;

    lpr:打印相关的讯息!

    mail:只要与邮件收发有关的讯息纪录都属于这个;

    news:与新闻群组服务器有关的东西;

    syslog:syslogd 这支程序本身产生的信息啊!

    user, uucp, local0 ~ local7:与 Unix like 机器本身有关的一些讯息。

     

    讯息等级

    系统将讯息分为七个主要的等级,依序是由不重要排列到重要讯息等级:

    info:仅是一些基本的讯息说明而已;

    notice:比 info 还需要被注意到的一些信息内容;

    warning 或 warn:警示讯息,可能有问题,但是还不至于影响到某个 daemon 运作。

    err 或 error :一些重大的错误讯息,这就要去找原因了。

    crit:比 error 还要严重的错误信息,crit 是临界点 (critical) 的缩写,已经很严重了!

    alert:警告警告,已经很有问题的等级,比 crit 还要严重!

    emerg 或 panic:疼痛等级,意指系统已经几乎要当机的状态! 很严重的错误信息了。

      除了这些有等级的讯息外,还有两个特殊的等级,那就是 debug(错误侦测等级) 与 none (不需登录等级) 两个,当要作一些错误侦测,或者是忽略掉某些服务的信息时,就用这俩!

     

    在讯息等级之前还有 [.=!] 的连结符号!他代表的意思是:

    . :代表比后面还要高的等级(含该等级)都被记录下来的意思, 例如:mail.info 代表只要是 mail 的信息,而且该信息等级高于 info (含info )时,就会被记录下来。

    .=:代表所需要的等级就是后面接的等级而已!

    .!:代表不等于。

     

    日志文件记录的文件名或装置或主机常见的放置处:

    文件的绝对路径:通常就是放在 /var/log 里头的文件!

    打印机或其它:例如 /dev/lp0 这个打印机装置  (即使被黑客可以删除掉日志文件,但是最终删除不了打印出来的日志信息)

    使用者名称:显示给使用者!

    远程主机:例如 @test.adsldns.org,要对方主机也能支持才行!

    *:代表目前在线的所有人,类似 wall 这个指令的意义!

     

    看看在尚未开启网络服务的情况下来自 Fedora Core Release 4 的相关资料

    [root@linux ~]# vi /etc/syslog.conf

    #kern.*                                    /dev/console

    # 只要是 kernel 产生的讯息,全部都送到 console 去!默认是关闭的。

    *.info;mail.none;authpriv.none;cron.none   /var/log/messages

    # 在已知各服务的讯息中,不要记录到这个文件中,把已知的服务记录到单独的日志文件中去,方便日后查询,否则messages这个文件就太混乱了。这个文件非常重要,所有未知的信息都会被记录在这个文件中,所以有问题,找这个文件就八九不离十了。

    authpriv.*                                 /var/log/secure

    # 这个就是经过一些身份确认的行为之后,需要记录身份的文件。

    mail.*                                     -/var/log/maillog

    # 只要跟 mail 有关的(不论是 pop3 还是 sendmail )都会被纪录到这个文件!

    cron.*                                     /var/log/cron

    #例行性命令相关的。

    *.emerg                                    *

    # 任何时候发生的警告讯息都会显示给在线的所有人!那个 * 就是目前在线的所有人。

    uucp,news.crit                             /var/log/spooler

    # 记录新闻错误高于 crit 的等级的信息,写入 spooler 当中!

    local7.*                                   /var/log/boot.log

    # 将开机的当中的讯息写入 /var/log/boot.log 中!

      每个版本的 syslog.conf 差异是很大的,所以,每个登录文件记录的数据其实不很固定。

     

    例:让所有的信息都额外写入到 /var/log/admin.log!

    [root@linux ~]# vi /etc/syslog.conf

    *.info          /var/log/admin.log  》》如果服务器硬盘容量够大,这么做也不失为一个良策。

    [root@linux ~]# /etc/init.d/syslog restart

    [root@linux ~]# ll /var/log/admin.log

    -rw-------  1 root root 122 Oct 23 22:21 /var/log/admin.log  》》注意权限

     

     

    分析登录文件
    dmesg

    [root@linux ~]# dmesg | more

      由于系统在开机的过程当中尚未将硬盘 mount 上来,所以无法直接将数据直接读到 log file 当中去,但是为了除错上面的方便, 所以在开机的过程当中的讯息还是要记录下来,这个时候系统就将 ram 开了一个小区块来储存这个数据!这个开机记录文件就是:/proc/kmsg!

      几乎所有的核心信息都可以使用 dmesg 来查阅得到的,例 想要知道开机有没有捉到网卡,dmesg | grep 'eth' !

     

    last

    [root@linux ~]# last -n number

    [root@linux ~]# last -f filename

    参数:

    -n  :last 会读出这个月的数据,若数据量太大,可使用 -n 来严格要求显示的笔数。例如 20 笔数据: last -n 20 或 last -20 均可。

    -f  :last预设读出 /var/log/wtmp,但是我们可以透过 -f 读取不同的登录文件信息!

     

    例,将上个月的资料读出,仅读出5笔资料

    [root@linux ~]# last -n 5 -f /var/log/wtmp.1

    dmtsai2  pts/2             Mon Oct 24 14:18 - 14:18  (00:00)

    dmtsai2  work:0 work       Mon Oct 24 14:18    gone - no logout

    dmtsai2  work:0 work       Mon Oct 24 14:18 - 14:18  (00:00)

    dmtsai2  pts/2             Mon Oct 24 14:18 - 14:18  (00:00)

    dmtsai2  work:0 work       Mon Oct 24 14:18 - 14:18  (00:00)

     

    [root@linux ~]# lastlog

    lastlog 只是读出 /var/log/lastlog 内的信息. 他会显示目前系统上面的所有账号当中,每个账号最近一次登入的时间!

     
     

    Linux系统的LOG日志文件介绍!

    UNIX网管员主要是靠系统的LOG,来获得入侵的痕迹.当然也有第三方工具记录入侵系统的 痕迹,UNIX系统存放LOG文件,普通位置如下:

    /usr/adm - 早期版本的UNIX

    /var/adm - 新一点的版本使用这个位置

    /var/log - 一些版本的Solaris,linux BSD,Free BSD使用这个位置

    /etc - 多数UNIX版本把utmp放在这里,有些也把wtmp放在这里,syslog.conf在这里

     

    下面的一些文件根据你所在的目录不同而不同:

    acct 或 pacct -- 记录每个用户使用的命令记录

    access_log -- 主要当服务器运行NCSA HTTPD时, 记录什么站点连接过你的服务器

    aculog -- 保存着你拨出去的MODEMS记录

    lastlog -- 记录了用户最近的LOGIN记录和每个用户的最初目的地,有时是最后不

    成功LOGIN的记录,当一个用户登陆到unix系统,注册程序在lastlog文件中查找该用户的uid,如果该程序找到了

    该用户的uid,unix就会显示最后一次登陆的时间和tty(终端号)

    loginlog -- 记录一些不正常的LOGIN记录

    messages -- 记录输出到系统控制台的记录,另外的信息由syslog来生成

    security -- 记录一些使用UUCP系统企图进入限制范围的事例

    sulog -- 记录使用su命令的记录.它通常在/var/adm/sulog.如果你在机器上使用了su命令,别忘了清除哦.

    utmp -- 记录当前登录到系统中的所有用户,这个文件伴随着用户进入和离开系统而不断变化.它还会为系统中的用户保持很长的历史记录,utmp日志通常存放在/var/adm/utmp目录下.可以用w和who命令查看,其他命令也可以访问这个文件.如:finger root就可以.现在的utmp一般都有utmpx文件作为日志记录的补充.

    utmpx -- UTMP的扩展

    wtmp -- 记录用户登录和退出事件.它和utmp日志文件相似,但它随着登陆次数的增加,它会变的越来越大,有些系统的ftp访问也在这个文件里记录,同时它也记录正常的系统退出时间,可以用ac和last命令访问.

    syslog -- 最重要的日志文件,使用syslogd守护程序来获得日志信息,通常情况下通过查看/etc/syslog.conf.我们可以知道syslog记录些什么.缺省时,它把大多的消息传给/var/adm/message.

    /dev/log -- 一个UNIX域套接字,接受在本地机器上运行的进程所产生的消息

    /dev/klog -- 一个从UNIX内核接受消息的设备

    514端口 -- 一个INTERNET套接字,接受其他机器通过UDP产生的syslog消息。

    uucp -- 记录的UUCP的信息,可以被本地UUCP活动更新, 也可有远程站点发起

    的动作修改,信息包括发出和接受的呼叫,发出的请求,发送者, 发

    送时间和发送主机

    lpd-errs -- 处理打印机故障信息的日志

    ftp日志 -- 执行带-l选项的ftpd能够获得记录功能

    httpd日志 -- HTTPD服务器在日志中记录每一个WEB访问记录

    history日志 -- 这个文件保存了用户最近输入命令的记录

    vold.log -- 记录使用外接媒介时遇到的错误记录

    ======================

    其他类型的日志文件-

    ======================

    有些类型的LOG文件没有特定的标题,但开始于一个特定的标志, 你可以在前面头发现如

    下的标志,这就一般表示此是个LOG日志文件,你就可以编辑它了:

    xfer -- 表明试图一个禁止的文件传输.

    rexe -- 表明试图执行一个不允许的命令

    还有许多其他其他类型的LOG文件存在,主要是第三方软件引起的, 或者甚至他妈的网管

    自己有设置了一只"眼睛"在他的系统上,所以你要对你认为可能是LOG文件的文件多一份心眼。

    许多管理员喜欢把日志文件放在同一个目录中以便管理, 所以你要检查你发现的LOG文件所在

    的目录中,是否有其他日志文件放在这里,如果有,咯,你知道怎么做。

    另一个你要注意的是有关LOG用户MAIL的文件,此文件名可以多种多样,或则有时是

    syslog文件的一部分。你要知道syslog记录那些信息, 你可以查看syslog.conf中的信息此文

    件的目录是在/etc中

    一般我们都是查看syslog.conf文件来查看日志的配置情况.例如:cat /etc/syslog.conf

    其中sunos操作系统的在/var/log和/var/adm下,还有/usr/adm为/var/adm的的链接.

    redhat的在/var/log 和 /var/run下

    下面的是sun os5.7中的日志样本. 此外,各种shell还会记录用户使用的命令历史,它使用用户主目录下的文件来记录这些命令历史,通常这个文件的名字为.sh_history(ksh),.history(csh),或.bash_history(bash)等。

    # ls /var/adm

    acct    log      messages.1    passwd    sulog   vold.log

    aculog   messages   messages.2    sa      utmp   wtmp

    lastlog   messages.0  messages.3    spellhist   utmpx   wtmpx

    # ls /var/log

    authlog      syslog    syslog.1   syslog.3

    sysidconfig.log  syslog.0   syslog.2   syslog.4

     

    下面的是redhat9.0中的日志样本.

    # ls /var/log

    boot.log   dmesg       messages.2    secure     uucp

    boot.log.1  htmlaccess.log  messages.3    secure.1    wtmp

    boot.log.2  httpd       messages.4    secure.2    wtmp.1

    boot.log.3  lastlog      netconf.log   secure.3    xferlog

    boot.log.4  mailllog      netconf.log.1  secure.4    xferlog.1

    cron     maillog      netconf.log.2  sendmail.st   xferlog.2

    cron.1    maillog.1     netconf.log.3  spooler     xferlog.3

    cron.2    maillog.2     netconf.log.4  spooler.1    xferlog.4

    cron.3    maillog.3     news       spooler.2

    cron.4    maillog.4     normal.log    spooler.3

    daily.log   messages     realtime.log  spooler.4

    daily.sh   messages.1     samba      transfer.log

     

    # ls /var/run

    atd.pid    gpm.pid    klogd.pid   random-seed    treemenu.cache

    crond.pid   identd.pid   netreport   runlevel.dir   utmp

    ftp.pids-all inetd.pid   news      syslogd.pid

    一般我们要清除的日志有

    lastlog

    utmp(utmpx)

    wtmp(wtmpx)

    messages

    syslog

    sulog

    一般把以上说的日志给擦一下,就可以了.

    下面我来说说上面这些我们要清除的日志的相关资料和清除方法.更详细的资料和其他的日志请你查看相关资料.

    上面已经对日志的功能做了简单陈述,那么这些日志文件到底记录的是什么呢? follow me

    下面是一个例子:

    SunOS 5.7

    login: gao

    Password:

    No directory! Logging in with home=/

    Last login: Sun Feb 4 22:18:25 from 219.31.36.7

    Sun Microsystems Inc. SunOS 5.7 Generic October 1998 $ 

    然后注册程序用新的登陆时间和TTY信息更新lastlog文件,而且该程序带更新utmp wtmp.文件.


    shell记录:


    .sh_history(ksh),.history(csh),或.bash_history(bash)等,是shell执行时的历史记录.记录用户执行的命令.它一般存在于用户的主目录.别忘了去根目录看看.

     

    1.日志都是一些文本形式的文件.最笨的方法是用文本编辑器来编辑日志文件.删除相关的记录.来达到擦拭脚印和隐藏自己的效果.

    比如用vi等,但这样做是很笨的.太麻烦,工作量太大.

     

    2.用rm -f 来删掉日志.比如rm -f /usr/adm/lastlog

    这样做是很蠢的.更容易被管理员发现有人入侵.但是,相对来说自己还是保护好了. 可以用在一些不太重要的机器上.

    3.用>定向符清除.

    比如:

    cat > /usr/log/lastlog

    ->这里输入你要的写的东西.最好伪装得像一些,也可以不输入哦.

    ^d ->这里的^d是按键 ctrl + d.

    # .

     

    展开全文
  • FTP服务器日志解析

    千次阅读 2015-02-04 15:40:00
    服务器日志解析 FTP 是老牌的文件传输协议,在网络中应用非常广泛。本节就 Vsftp 服务器的日志进行重点讨论,在本书的 FTP 多级跳案例中就会涉及到本节学到的知识。在 Redhat Linux 系统下 Vsftp 的配置文件在 /...

    FTP服务器日志解析

    FTP是老牌的文件传输协议,在网络中应用非常广泛。本节就Vsftp服务器的日志进行重点讨论,在本书的FTP多级跳案例中就会涉及到本节学到的知识。在Redhat Linux系统下Vsftp的配置文件在/etc/vsftp/vsftp.conf文件中。默认情况下,Vsftp不单独记录日志,也就是说不会输出到一个单独的文件中存储,而是统一存放到/var/log/messages文件中。Vsftp日志实例显示如图1所示。

    153723_YtjR_71229.jpg

    1 Vsftp日志实例

    通过在messages过滤得方法可以看到Vsftp的客户机连接日至,但这段日志里只反映了少量信息,如果需要查看更详细的信息如何操作?下面我们来编辑/etc/vsftp/vsftp.conf配置文件。

    如何将Vsftp服务器的日志文件单独输出到某个文件下呢?这里需要三个步骤:

    153735_tcCA_71229.jpg

    下面对重要语句做一些解释:

    标识A: 启用xferlog_enable=YES,它表示将客户机登录服务器后上传或下载的文件具体信息记录。

    标识B:启用xferlog_file=/var/log/vsftpd.log,它表示将上传下载写到指定文件,也就是/var/log/xferlog文件。

    标识C:启用dual_log_enable=YES,它表示启用双份日志,一份日志由xferlog记录,同时vsftpd.log也记录另一份日志,注意他们两儿可不是互为备份,其内容不同,但各有千秋。

       接下来还得解释一下/usr/bin/xferstats这个工具,它是日志统计工具,用于计算传输了多少文件并创建日志文件。

    注意:在您的Linux系统中一定安装xferstats的包,才能对他进行操作,如果发现找不到xferstats没有命令就要安装这个包。

    1.3.1 分析vsftpd.logxferlog

    Vsftpd.logxferlogVsftp服务器记录日志的来源,下面重点对着两种日志文件的格式做一下分析。

    1vsftpd.log实例分析首先打开vsftpd.log.1文件,看看它的日志结构。如图2示。

    153748_RRZ7_71229.jpg

    2 ftpd分离后的日志结构

    在图1-9中日志仅反映了部分Ftp登录情况:例如登录IP地址、用户名。但下载软件内容不会记录下来,有时网管恰好关心这一段日志信息,这时我们需要同时参考xferlog日志,还记得上面说过的xferstats工具吗?

    2Xferlog日志实例分析

    xferlog日志会记录FTP会话详细信息,它能够显示客户机向FTP Server上传/下载的文件路径及名称认证方式等信息,下面我们看看这个文件的具体内容, xferlog日志格式见表1-4所示。

    153759_8Fcw_71229.jpg

    Xferlog日志格式解析:

    153821_dkS2_71229.jpg

     

       注意:这里指的认证是结合PAM(一种可插入的安全验证模块)的方式,主要是为了保证安全,在企业中常会用到Vsftp+Pam+Postgresql的架构,在这种架构中我们可以设置为用MD5工具来验证密码,这样客户机在远程要用MD5加密过密码的用户登录才能成功获取文件,有关PAM的应用在本书的第九章SSH加固中也会提到。

    1.3.2 中文对Vsftp日志的影响

    大家在使用RHEL5系统中的Vsftp2.05版)时有时会遇到下面中文日志的显示问题,我们看看下面的例子。如果客户机上传的文件中含有中文名那么日志将显示乱码,例如新建一个带中文的文件夹,发现在其日志(/var/log/xferlog/var/log/vsftpd.log)中就会产生如下日志(不能正常的显示中文):

    Sat Jan 12 00:26:18 2013 [pid 6853][ftp] FAIL MKDIR: Client “192.168.150.1”, “/pub/???????????”

       当日志中出现乱码,怎么办呢?

    Ø  将系统安装成为默认为中文;

    Ø  调整字符集,将系统的字符集改成zh_CN.gb;或者将字符集修改为GB2312

    Ø  修改vsftpd.conf,加入syslog_enable=yes参数,编辑vsftpd.conf,再重启vsftpd

    经过笔者尝试,以上三种方法都不能解决中文日志的输出问题。其实,并不是设置问题,是Vsftpd本生问题(当然修改源码然后编译安装是可以解决的),要解决就要将日志输出到/var/log/messages,可这样做和我们当初想法将他分离相违背, 有兴趣的读者也可采用Proftp,见图2示。它的主要优点是,不但可以完整的记录中文的文件名在日志汇总,还可以日志分离,查看起来比较方便。

    153850_iFXg_71229.jpg

    2Proftp中文日志显示

    1.3.2 Logparser分析FTP日志

       在分析了Vsftp服务器日志后,在实际工作中Windows系统下的FTP服务器应用的也不少, 微软的IIS服务器常常会成为入侵的对象。微软LogParser工具是Windows系统下功能非常的强大的日志分析工具,它可以分析IIS日志这种基于文本的日志格式,操作系统事件日志还能分析CSVXML这类的文件格式,尤其对于上百兆甚至是上GB的日志文件都可以快速分析,利用LoParser能轻松查出你需要的数据,而且还能以图表的形式输出结果。下面就用这款工具来筛选FTP日志中的异常连接。主要分为了收集Ftp日志、导入数据库、日志数据筛选和异常数据分离四个步骤:

    步骤一: FTP日志的采集

    微软IIS服务器的FTP日志文件默认位置为%systemroot%\system32\LogFiles\MSFTPSVC1\,对于绝大多数系统而言则是C:\WINDOWS\system32\LogFiles\MSFTPSVC1(如果安装系统时定义了系统存放目录则根据实际情况修改),系统默认每天自动生成一个日志文件。日志文件的名称格式是: ex + 年份的末两位数字+月份+日期,如2006 319日的FTP日志文件是ex060319.log,这是个文本文件,可以用任何编辑器打开,例如记事本程序。

       为了详细地分析采集来的FTP日志,下面我们先来看看常见的命令有: USER 〈用户名〉、PASS〈密码〉、DELE <文件名>QUIT 等,由于命令较多本节中就不一一列出了。对于常见的响应提示信息,如表2所示(与Apache的类似)。

    2 FTP 响应信息含义

    状态代码

    2XX开头

    成功

    3XX开头

    权限问题

    4XX开头

    文件问题

    5XX开头

    服务器故障

        FTP 命令加上响应号才具有实际意义,例如:USER stu 331 表示用户试图登录, PASS - 230 表示登录成功。

    步骤二:FTP日志导入MS SQL数据库

       Ftp日志导入到SQL Server数据库,首先在需要安装好LogParser 2.2+SQL Server环境;然后在待分析机器上装好SQL  Server 环境,然后新建数据库名为iis;最后将IIS日志拷贝到本机。准备工作完成后输入如下命令:

    logparser.exe "select * from C:\WINDOWS\system32\LogFiles\MSFTPSVC1\ex*.log to iisftplog_table" -o:sql -server:127.0.0.1 -driver:"sql server" -database:iis -username:sa -password:123456 -createtable:on

    命令执行和输出效果见图3所示

    153911_adGP_71229.jpg

    3   Logparser命令执行和输出效果

        在执行上面命令时,一定要指定日志文件的完整路径,否则将出现找不到日志的提示。 Logparser程序正确输出后,就可以打开数据库检查了,如图4、图5所示。

    153921_uUkj_71229.jpg

    4 在企业管理器中打开iislog_table

    153935_8Rmi_71229.jpg

    5 查看iisftplog_table

    步骤三:FTP日志数据的筛选

    IISFTP日志包括5 个域: timec-ipcs-methodcs-uri-stem sc-status

    下面选取了FTP服务器某日白天的日志, 一共1万多条条记录

    #Software: Microsoft Internet Information Services 5.2

    #Version: 1.0

    #Date: 2010-05-08 08:30:23

    #Fields: time c-ip cs-method es-uri-strem sc-status

    08:30:23 192.168.3.62 [1]USER stu 331

    08:30:23 192.168.3.62 [1]PASS -   530

    08:30:28 192.168.3.62 [2]USER stu 331

    08:30:29 192.168.3.62 [2]PASS -   530

    ... ...

    09:10:23 192.168.3.135 [15]USER anonymous 331

    09:10:23 192.168.3.135 [15]PASS IEUser@   230

    09:10:37 10.10.1.200   [16]USER px        331

    09:10:37 10.10.1.200   [16]PASS -         530

    ... ...

    21:44:21 63.103.87.197  [1163]USER anonymous  331

    21:44:21 63.103.87.197  [1163]PASS yourname@yourcompany.com  230

    21:44:40 63.103.87.197  [1163]sent  /mp3.ape  550

    FTP日志文件导入MS SQL 数据库后,字段名保留日志文件中的名字,下面就可以通过脚本对FTP进行深度处理。

    步骤四:分离正常与异常数据源

    FTP日志文件导入至MS SQL服务器后,在数据库中用SQL命令将每一天的数据都按cs-method 字段进行升序排序。每天日志中cs-method 字段相同的记录表示该用户这次登录所做的一系列操作,数据库中记录是否出现异常响应,可以根据sc-status 字段的值来判断,例如如果出现登录错误, PASS-530,连续出现3 次以上,则认为异常。可以将异常的登录错误信息输出即可,进过这样对FTP日志文件进行的深度挖掘,能非常方便管理人员迅速判断故障,提高了工作效率和准确度。

    转载于:https://my.oschina.net/chenguang/blog/375311

    展开全文
  • 基于深度模型的日志序列异常检测

    千次阅读 2021-04-23 13:36:06
    基于序列的深度模型日志异常检测 ​ 日志异常检测的核心是利用人工智能算法自动分析系统日志来发现并定位故障。根据送入检测模型的数据格式,日志异常检测算法模型分为序列模型和频率模型,其中序列模型又可以分为...
  • java异常解析

    千次阅读 2018-11-20 16:55:20
    异常很常见,当抛出异常时,如果不能锁定问题出在哪,是令人非常头疼的问题,那么如果知道抛出的异常整个堆栈的详细信息,然后进一步的去分析会不会找到原因所在呢,在这里提供一个方式去打印出异常堆栈信息 ...
  • 正则解析复杂异常日志(一次性解析不出全部格式异常日志怎么办?) 根据不同产品的Exception做数据清洗以及多目标分发 对不同的产品的异常日志做数据分析 2. 背景 业务背景: 采集并脱敏了整个5月份的项目异常日志...
  • 注意:异常和错误的区别:异常能被程序本身可以处理,错误是无法处理。 Error: 这种异常被设计成不被捕获,因为这种异常产生于JVM自身。Runtime Exception: 运行时异常往往与环境有关,编译时无法检查...
  • 使用Hive进行分析的过程中遇到了这个异常的信息,一开始看到比较惊讶,因为感觉代码并没有什么不太合理的地方,不过还是抛出了一堆的异常信息,我把日志信息读了一下,发现导致最终异常的是FastJson在封装的时候找不...
  • java深入浅出解析异常机制

    千次阅读 2017-03-02 19:38:44
    三月份啦,月初第一篇写一份异常机制的完全解析,表明这个月努力学习的决心! 以下长文预警!!! java中的异常处理的目的在于通过使用少量的代码,使得程序有着强大的鲁棒性,并且这种异常处理机制会让你变得非常...
  • JAVA常见异常解析

    千次阅读 2015-01-23 17:26:03
     这个异常大家肯定都经常遇到异常的解释是"程序遇上了空指针",简单地说就是调用了未经初始化的对象或者是不存在的对象,这个错误经常出现在创建图片,调用数组这些操作中,比如图片未经初始化,或者...
  • 关于Fastjson 数组解析异常问题的排查 今日在使用字符串转json的时候,遇到问题,发现转换失败, 报错日志如下: com.alibaba.fastjson.JSONException: expect '[', but string, pos 8, line 1, column 9"G2京沪高速...
  • OpenJDK 11 JVM日志相关参数解析与使用

    千次阅读 2020-02-28 16:01:08
    OpenJDK 11是在OpenJDK 8之后的第一个长期支持版本,这一版本在JVM日志配置有了很大改动,主要是规范化,...这篇文章会对于这些配置做一个详尽的说明和解析。 一、JVM日志标签 JVM日志和我们java代码中的日志,其实...
  • logstash日志收集遇到的坑

    千次阅读 2019-10-22 14:10:42
    使用vim测试logstash时发现每次读取都是后两行日志。 用echo 111 >> test.log测试读取正常。 猜测是光标的原因,fluentd也有这样的问题。
  • 深度解析CentOS通过日志反查入侵

    千次阅读 2016-09-02 01:04:29
    昨天晚上群里有一个朋友的...学会使用通过日志来排查解决我们工作中遇到的一些问题是很有必要的。下面就一一道来。 大纲 Linux日志系统简介 Linux日志分析 Linux日志入侵发现 实例分析 Linux日志
  • java异常及错误解析

    千次阅读 2018-08-27 14:02:55
    什么是异常? (Throwable)简单粗暴一点的解释就是程序中的错误,但是并不是所有的错误都是异常,比如说Error。举个栗子,你写代码的时候写着写着分号被你丢了,这种情况下会怎么样? 报错了吧,这个你要是不去...
  • 常见异常解析

    千次阅读 2011-09-18 16:29:48
    ConcurrentHashMap与CopyOnWriteArrayList比较。 博客分类: Java ...ConcurrentHashMap ...ConcurrentHashMap引入了Segment,每个Segment又是一个hashtable,相当于是两级Hash表,然后锁是在Segment一级进行的,...
  • java异常例子解析及常见的异常类型

    千次阅读 2013-10-31 14:45:42
    六种异常处理的陋习 你觉得自己是一个Java专家吗?是否肯定自己已经全面掌握了Java的异常处理机制?在下面这段代码中,你能够迅速找出异常处理的六个问题吗? 1 OutputStreamWriter out = ... 2 java.sql....
  • JAVA EE项目中,不管是对底层的数据操作,还是业务层的处理过程,还是控制层的处理,都不可避免的会遇到各种可预知的(业务异常主动抛出)、不可预知的异常需要处理。一般dao层、service层的异常都会直接抛出,最后由...
  • Javebean声明boolean类型isXXX解析异常

    千次阅读 2017-07-17 16:04:49
    遇到的问题还略坑,使用老版本fastjson且不使用注解在未开启混淆的情况下boolean isXXX属性是能够正确解析的,开启混淆后就不行了。此时直接加注解是可以的,更新到新版本后不加注解也可以,想想也是心累,...
  • 前端代码异常日志收集与监控

    千次阅读 2017-05-31 11:24:33
    Code Review 都是不够的,如果对页面稳定性和准确性要求较高,就必须有一套完善的代码异常监控体系,本文从前端代码异常监控的方法和问题着手,尽量全面地阐述错误日志收集各个阶段中可能遇到的阻碍和处理方案。...
  • Spark解析binlog日志,写入MySQL

    千次阅读 2019-06-03 23:04:16
     MySQL ——> 产生binlog日志 ——> Maxwell解析成json格式 ——> 发送到Kafka ——> 通过Spark消费 ——> 写入MySQL   3. 处理思路  由于需要同步的表非常多,因此通过JavaBean反射的方式去解析...
  • 一、异常捕获 对于前端来说,我们需要的异常捕获无非为以下两种: 接口调用情况; 页面逻辑是否错误,例如,用户进入页面后页面显示白屏; 对于接口调用情况,在前端通常需要上报客户端相关参数,例如:用户OS与...
  • 最近开发遇到一个bug,异常日志为:nested exception is org.codehaus.jackson.JsonParseException: Invalid UTF-8 start byte 0xbc,从日志上可以看出,springMVC在解析json数据时,发现json数据不是utf-8的格式,...
  • 在解决数据库问题过程中,我们偶尔会遇到数据库归档日志异常增长的情况,这种问题相对都比较棘手,而且其对数据库的影响非常明显,主要表现在:  数据库性能压力陡增,整体性能下降  磁盘IO压力增大,形成IO瓶颈 ...
  • 概述 MySQL的安装可以参考:Linux(CentOS)中常用软件安装,使用及异常——MySQL, VmTools MySQL关于Binlog的官方文档:The Binary Log ...MySQL Server 有四种类型的日志——Error Log、General Query Log、Binary
  • 目录如果整合Yarn报错或无法查看log需做如下操作如果要整合YARN历史服务器和Spark历史服务器,则还需要如下操作配置历史日志服务器本地调试 如果整合Yarn报错或无法查看log需做如下操作 1.修改hadoop的yarn-site.xml...
  • 前端JS解析超长的数字异常的问题。

    千次阅读 2017-07-27 15:23:53
    问题:前段时间开发遇到了一个很奇怪的问题。创建订单之后返回给前端一个订单编号,订单编号是一个超长的数字。前端用订单编号查询订单信息的时候经常出现错误的订单信息,根据日志判断是前端传给后端的订单号是不...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 38,126
精华内容 15,250
关键字:

日志解析遇到异常