# App Log Analysis API

Our Application Log Analysis REST API delivers in-depth diagnostics to uncover critical issues such as exceptions, time delays, and repeating error patterns. These insights help in proactively identifying stability and performance issues in your application. This API is ideal for teams looking to automate root cause analysis and eliminate hours of manual log inspection.

# How to invoke Application Log analysis API?

Follow the steps below to invoke the Application Log (App Log) API:

EndPoint

  1. Use the following endpoint to invoke the App Log API:

    https://<HOST:PORT>/analyze-log-api?apiKey=<YOUR_API_KEY>

    Replace the placeholders with your actual values:

    HOST: Host/IP address where yCrash server is installed.

    PORT: Port in which yCrash server is listening.

    YOUR_API_KEY: Your API key was provided with your license at the time of registration. If you're not sure where to find the API key, click here (opens new window).

  2. The body of the HTTP request should contain the application log file you want to analyze.

  3. HTTP Response will be sent back in JSON format, containing several key statistics and insights about the uploaded application log. One of the most important elements in the response is isSerious, which indicates whether any serious errors were detected during analysis. If isSerious is set to true, you should inspect the accompanying errorAnalytics section to review detailed information about the critical issues found in the logs.

The JSON response includes the following key data points:

  • Statements count (log level stats like ERROR, INFO, WARN, etc.)

  • List of top errors

  • Time gaps between log entries

  • Repeating log statements

  • PII statements (sensitive data patterns)

  • Custom patterns (user-defined patterns matched in log lines)

  • Web report URL to view the full visual analysis in a browser

# CURL command

Assuming your application log file is located in "./my-app.log," then CURL command to invoke the API is:

curl -X POST --data-binary @./my-app.log https://api.ycrash.io/analyze-log-api?apiKey={YOUR_API_KEY} --header "Content-Type:text"
1

It can’t get any more simpler than that? Isn’t it? 🙂

# Compression

Application log files can be large in size. For efficient transmission and processing, it's recommended to compress the log files before uploading.

If you compress the log file (e.g., into .zip format), you need to specify the compression type either in the HTTP header element or as a URL parameter.

Say suppose you are compressing app log file into 'zip' format, then you can invoke the API with HTTP header element

curl -X POST --data-binary @./my-app.zip "https:/<HOST:PORT>/analyze-log-api?apiKey={YOUR_API_KEY}" --header "Content-Type:text" --header "Content-Encoding:zip"
1

or you can also invoke the API with 'Content-Encoding' element in the URL parameter

curl -X POST --data-binary @./my-app.zip "https://api.ycrash.io/analyze-log-api?apiKey={YOUR_API_KEY}&Content-Encoding=zip" --header "Content-Type:text"
1

We support following compression formats :

zip, gz, xz, z, lzma, deflate, sz, lz4, zstd, bz2, tar

You may use the one of your choice. Whatever compression format you used for compressing the app log files should be passed in the 'Content-Encoding' element.

Note

Use the option "–data-binary" in the CURL instead of using "–data" option. In "–data" new line breaks will not be preserved in the request. New Line breaks should be preserved for legitimate parsing.

# Other Tools

You can also invoke the API using any web service client tools such as: SOAP UI, Postman Browser Plugin,…..

img

Fig: Posting App logs through Postman plugin

# Sample Response

{
    "logSummary": {
        "totalStatements": 10078,
        "logLevelStats": {
            "non-confirming": 686,
            "ERROR": 4864,
            "INFO": 5214
        }

    },
    "errorAnalytics": [
        {
            "count": 3632,
            "error": "java.lang.NumberFormatException",
            "isSerious": false
        },
        {
            "count": 477,
            "error": "java.lang.NullPointerException",
            "isSerious": false,
            "stacktrace": [
                "\tat java.base/java.text.SimpleDateFormat.parse(SimpleDateFormat.java:1470)",
                "\tat java.base/java.text.DateFormat.parse(DateFormat.java:393)",
                "\tat com.tier1app.ycrash.orchestrator.DeviceReportAnalyzer.isBetweenThrityMin(DeviceReportAnalyzer.java:731)",
                "\tat com.tier1app.ycrash.orchestrator.DeviceReportAnalyzer.buildLinuxDmesg(DeviceReportAnalyzer.java:544)",
                "\tat com.tier1app.ycrash.orchestrator.DeviceReportAnalyzer.processDmesg(DeviceReportAnalyzer.java:516)",
                "\tat com.tier1app.ycrash.orchestrator.DeviceReportAnalyzer.analyzeDmesg(DeviceReportAnalyzer.java:144)",
                "\tat com.tier1app.ycrash.entity.YCrashDataType.processDeviceArtifacts(YCrashDataType.java:102)",
                "\tat com.tier1app.ycrash.api.YCReceiverServlet.analyze(YCReceiverServlet.java:347)",
                "\tat com.tier1app.ycrash.api.YCReceiverServlet.analyze(YCReceiverServlet.java:252)",
                "\tat com.tier1app.framework.api.APIServlet.doProcess(APIServlet.java:125)",
                "\tat com.tier1app.framework.api.APIServlet.doPost(APIServlet.java:68)",
                "\tat javax.servlet.http.HttpServlet.service(HttpServlet.java:681)",
                "\tat javax.servlet.http.HttpServlet.service(HttpServlet.java:764)",
                "\tat org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:227)",
                "\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162)",
                "\tat org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53)",
                ----
            ]
        },
        {
            "count": 310,
            "error": "java.lang.StringIndexOutOfBoundsException",
            "isSerious": false
        },
        {
            "count": 131,
            "error": "java.io.FileNotFoundException",
            "isSerious": false
        },
        {
            "count": 122,
            "error": "java.io.FileNotFoundException: threshold-settings.json (No such file or directory)",
            "isSerious": false,
            "stacktrace": [
                "\tat java.base/java.io.FileInputStream.open0(Native Method)",
                "\tat java.base/java.io.FileInputStream.open(FileInputStream.java:219)",
                "\tat java.base/java.io.FileInputStream.&lt;init&gt;(FileInputStream.java:157)",
                "\tat java.base/java.io.FileInputStream.&lt;init&gt;(FileInputStream.java:112)",
                "\tat com.tier1app.util.FileUtil.loadPropertiesBF(FileUtil.java:422)",
                "\tat com.tier1app.util.ThresholdLoader.loadFromLocalStorage(ThresholdLoader.java:233)",
                "\tat com.tier1app.util.ThresholdLoader.loadThresholdSettingsFromJSON(ThresholdLoader.java:74)",
                "\tat com.tier1app.util.ThresholdLoader.loadThresholdSettings(ThresholdLoader.java:60)",
                "\tat com.tier1app.util.ThresholdLoader.settings(ThresholdLoader.java:35)",
                "\tat com.tier1app.entity.threshold.Threshold.value(Threshold.java:59)",
                "\tat com.tier1app.ycrash.analyzer.DFAnalyzer.findBreaches(DFAnalyzer.java:63)",
                "\tat com.tier1app.ycrash.analyzer.DFAnalyzer.analyze(DFAnalyzer.java:41)",
                ----
            ]
        }
    ],
    "timeGaps": [
        {
            "gapTimeInSeconds": 11220,
            "prevLine": "[2023-06-12 04:58:31,616,  INFO,  c.t.f.s.LCFilter,  ,  ,  ,  Catalina-utility-1,  Session destroyed event invoked.]",
            "currentLine": "[2023-06-12 08:05:32,042,  INFO,  c.t.f.s.LCFilter,  ,  ,  ,  Catalina-utility-1,  Session destroyed event invoked.]"
        },
        {
            "gapTimeInSeconds": 9444,
            "prevLine": "[2023-06-12 01:20:31,120,  INFO,  c.t.f.s.LCFilter,  ,  ,  ,  Catalina-utility-2,  Session destroyed event invoked.]",
            "currentLine": "[2023-06-12 03:57:55,262,  ERROR,  c.t.u.UserErrorUtil,  ,  ,  ,  http-nio-5001-exec-5,  ErrorMsg: Sorry, The Page you are looking for doesn't exist!, Exception: null, status code: 404, error context URL: http:///assets/images/favicon/safari-pinned-tab.svg, another URL: /assets/images/favicon/safari-pinned-tab.svg, heapDump file: null, ERROR]"
        },
        {
            "gapTimeInSeconds": 8857,
            "prevLine": "[2023-06-12 09:57:32,302,  INFO,  c.t.f.s.LCFilter,  ,  ,  ,  Catalina-utility-1,  Session destroyed event invoked.]",
            "currentLine": "[2023-06-12 12:25:10,244,  INFO,  c.t.f.s.LCFilter,  ,  ,  ,  main,  adding uploadDirectory to classpath]"
        },
        {
            "gapTimeInSeconds": 6060,
            "prevLine": "[2023-06-12 08:16:32,068,  INFO,  c.t.f.s.LCFilter,  ,  ,  ,  Catalina-utility-2,  Session destroyed event invoked.]",
            "currentLine": "[2023-06-12 09:57:32,302,  INFO,  c.t.f.s.LCFilter,  ,  ,  ,  Catalina-utility-1,  Session destroyed event invoked.]"
        },
        {
            "gapTimeInSeconds": 3636,
            "prevLine": "[2023-06-12 03:57:55,262,  ERROR,  c.t.u.UserErrorUtil,  ,  ,  ,  http-nio-5001-exec-5,  Incident Id is: 202361235755_19, status code: 404]",
            "currentLine": "[2023-06-12 04:58:31,616,  INFO,  c.t.f.s.LCFilter,  ,  ,  ,  Catalina-utility-1,  Session destroyed event invoked.]"
        }   
    ],
    "repeatingPatterns": [
        {
            "count": 3843,
            "statement": "\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162)"
        },
        {
            "count": 3200,
            "statement": "\tat org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189)"
        },
        {
            "count": 1816,
            "statement": " Failed to retrieve defined_classes, because of: java.lang.NumberFormatException"
        },
        {
            "count": 1816,
            "statement": " Failed to retrieve allocated, because of: java.lang.NumberFormatException"
        },
        {
            "count": 691,
            "statement": "\tat javax.servlet.http.HttpServlet.service(HttpServlet.java:764)"
        }
    ],
    "piiStatements": [
        {
            "count": 14,
            "statement": " Old hd-analysis-tracker file path - /home/ubuntu/apps/5001-yc-server-jdk11/./ycrash/Testing/2023/06/12/{IP_ADDRESS}/yc/16-04-32/hd-analysis-in-progress.txt"
        },
        {
            "count": 14,
            "statement": " New hd-analysis-tracker file path - /home/ubuntu/apps/5001-yc-server-jdk11/./ycrash/Testing/2023/06/12/{IP_ADDRESS}/yc/16-04-32/hd/hd-analysis-in-progress.txt"
        },
        {
            "count": 13,
            "statement": " /home/ubuntu/apps/5001-yc-server-jdk11/./ycrash/Testing/2023/06/12/{IP_ADDRESS}/yc/16-04-32/hd/superpower/hd-api-response.json doesn't exist!"
        },
        {
            "count": 13,
            "statement": " The hd-metadata.json content from local disk - [{\"indexFileCount\":0,\"fileName\":\"{IP_ADDRESS}-16-04-32-yc-yc.bin.phd\",\"isCompressedFile\":true,\"displayName\":\"{IP_ADDRESS}-16-04-32-yc-yc.bin.zip\",\"compressedFileName\":\"{IP_ADDRESS}-16-04-32-yc-yc.bin.zip\",\"isEATParse\":false,\"isSuperPowerParse\":true}]"
        },
        {
            "count": 8,
            "statement": " writing in to /home/ubuntu/apps/5001-yc-server-jdk11/./ycrash/Testing/2023/06/12/{IP_ADDRESS}-80-attendance-registry.txt, list: {IP_ADDRESS}"
        }
    ],
	"myPattern": [
        {
            "count": 4,
            "matchingPattern": " Failed to find UserLicenseLimitType from text:"
        }
    ],
    "webReport": "http://localhost:8080/yc-report-applog.jsp?ou=Testing&de=192.167.1.9&app=yc&ts=2025-08-09T13-42-46&fileName=e0a76f1e-2581-44a7-bcb6-235ea80807d7"
}

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151

# JSON Response Elements

Element Description
webReport Hyperlink to open the full visual analysis report in the browser.
>logSummary Contains high-level stats about the log, which includes total number of log lines & total number of error statements appeared in log.
totalStatements Total number of log lines parsed.
logLevelStats Displays counts of each log level (e.g., ERROR, INFO, WARN, non-confirming). Helps assess log severity distribution.
errorStatements Number of log lines that contain errors.
>errorAnalytics List of top error messages detected in the log file along with their frequency and severity.
count Number of occurrences of each error statement.
error It displays the error statement found in logs.
isSerious 'true' is returned if any serious errors are found. 'false' is returned if no serious errors are found.
>timeGaps It Lists delays (in seconds) between consecutive log lines that may indicate performance issues or bottlenecks
gapTimeInSeconds Time gap detected between the two log lines.
prevLine The log entry that appears immediately before the time gap. It represents the last recorded event before a delay in log activity.
currentLine The log entry that appears immediately after the time gap. It indicates the first event following the pause or delay in the logs.
>repeatingPatterns Displays frequently repeating log statements, which may signal excessive logging or loop-related issues.
count Number of times the log statement was repeated.
statement The log message that was repeated.
>piiStatements Displays detected sensitive data in logs by masking it (e.g., {IP_address}, {email}).
count Number of PII (Personally Identifiable Information) data detected in each log statement.
statement It shows the log statements where PII (Personally Identifiable Information) data was detected.
>myPattern 'My Patterns’ allows you to create and manage custom log patterns to filter logs efficiently. If a pattern you've added on the "Manage My Patterns" page matches any log statement, it will be displayed under "My Patterns" when viewing logs
count Displays the number of log entries that match your pattern.
matchingPattern It displays the log statement matching your custom pattern.