Log Reader

Overview

Plug-in Notes:

  • Allows only System Administrators or members of the Designers group to access log data.  
  • Does not load files outside the logs directory or files that do not end in .log.* or .csv.*.
  • On multi-application-server environments, logs will only be shown from a single application server.
  • Custom headers can be specified as an optional parameter. This is meant to be used for .csv files that don't contain a header.

Key Features & Functionality

The Appian Log Reader Plug-in contains functionality to:

  • Read files in the Appian /log folder (.csv or .log) and return them as structured data
  • Aggregate data from a .csv file
  • Serve as the source for a service-backed record for viewing logs
  • The Log Reader application provided with the download demonstrates a service-backed record for viewing logs, as well as reports on specific log files. Administrators can view reports on system health over time, including design best practices, system load, and database performance. The application also contains a process that checks details from system.csv and alerts administrators if memory or CPU utilization exceeds a threshold.
  • Tail a log file with tailcsv and taillog. Note that tail is an expensive operation which is optimized for reading the last few lines of a large log file. It's not advisable to tail the entire log file from the end to the beginning. However, tail will perform much better than the other log functions when reading the last few lines from a very large log file. Use the batch size and timestamp filters to limit the number of lines read by the tailcsv and taillog functions.
  • Takes a line of text in CSV format and returns a text array
Anonymous
  • I found the following problems after inspection of Log Reader Record Only 7.5 (1).zip

    Problems (1):
    content _a-0000e58d-c17f-8000-5249-01ef9001ef90_7961 "Lr_errorExpression": The content [id= uuid=_a-0000e58d-c17f-8000-5249-01ef9001ef90_7961] was not imported because a required precedent is missing: content [uuid=_a-0000da18-b569-8000-927a-010000010000_18681 location=Expression Rule Definition] cannot be found. (APNX-1-4070-001) (APNX-1-4071-006)

    Cascading Problems (2):
    content _a-0000e58d-c17f-8000-5249-01ef9001ef90_7955 "LR_reportWithError": The content [id= uuid=_a-0000e58d-c17f-8000-5249-01ef9001ef90_7955] was not imported because a required precedent is missing: content [uuid=_a-0000e58d-c17f-8000-5249-01ef9001ef90_7961 location=Interface Definition] cannot be found. (APNX-1-4070-001) (APNX-1-4071-006)
    tempoReport 3d2a70fa-f6a1-4cf8-be18-fe9ee7648df4 "Report with Design Error": The tempoReport [id= uuid=3d2a70fa-f6a1-4cf8-be18-fe9ee7648df4] was not imported because a required precedent is missing: content [uuid=_a-0000e58d-c17f-8000-5249-01ef9001ef90_7955 location=SAIL Dashboard] cannot be found. (APNX-1-4070-001) (APNX-1-4071-006)

    Warnings (1):
    pluginInfo com.appiancorp.ps.logreader "Log Reader": The plug-in "Log Reader" is referenced by object(s) in the package. The plug-in is on a different version in the target environment (APNX-1-4071-097)

    Success (69):
    group _e-0000d964-5fe5-8000-9277-010000010000_8 "LR Viewers"
    group _e-0000d964-5fe5-8000-9277-010000010000_7 "LR Admins"
    content _a-0000d94d-ebfc-8000-927a-010000010000_331 "Log Reader Rules and Constants"
    content _a-0000d94d-f0be-8000-927a-010000010000_333 "Record"
    content _a-0000d94d-f0be-8000-927a-010000010000_335 "LR_recordFacet_LastModified"
    content _a-0000d94d-f0be-8000-927a-010000010000_334 "LR_recordFacet_Extension"
    content _a-0000d94d-ebfc-8000-927a-010000010000_332 "LR_recordSource"
    content _a-0000d94d-f0be-8000-927a-010000010000_336 "Dashboard"
    content _a-0000d95d-3f26-8000-927a-010000010000_392 "Util"
    content _a-0000d94d-f0be-8000-927a-010000010000_337 "LR_returnFirstInput"
    content _a-0000d94d-f0be-8000-927a-010000010000_339 "LR_getCellFromLogRow"
    content _a-0000d94d-f0be-8000-927a-010000010000_338 "LR_createGridColumn"
    content _a-0000d960-5e44-8000-927a-010000010000_432 "LR_getItemFromSplit"
    content a688374a-0533-4b07-8e7d-e9aa396b32b4 "LR_displayLog"
    content 31fc8218-ca8e-416c-b979-8c2ad0a64e17 "LR_dashboardAdditional_LineChart"
    content _a-0000d954-74da-8000-927a-010000010000_348 "LR_recordFacet_Parent"
    content _a-0000d979-e92b-8000-927a-010000010000_569 "LR_RECORD_TYPE_LOGS"
    content 6e8e8975-f9a3-4dad-812d-3030382a276f "LR_displayCsv"
    content 9ba53d16-2aeb-4ed4-8ee6-5fc26f421ffb "LR_logDashboardMain"
    content _a-0000d962-59ae-8000-927a-010000010000_445 "Reports"
    content 60128d70-45ce-4a69-ac2c-7d3382735bdb "LR_reportBarChart"
    content _a-0000d965-94ed-8000-927a-010000010000_485 "LR_REPORT_BATCHSIZE"
    content cb85f4cf-a47e-4e6c-b681-028ce40bdaf6 "LR_reportExpressionPerformance"
    content ae3bb261-59ae-41d0-83fe-f0cef9dcadd4 "LR_reportDataStorePerformance"
    content _a-0000d965-94ed-8000-927a-010000010000_493 "Process"
    content _a-0000d965-94ed-8000-927a-010000010000_495 "LR_getLatestSystemCsvRow"
    content _a-0000e58d-c17f-8000-5249-01ef9001ef90_7943 "LR_ARRAY_DATA_METRIC_HEADERS"
    content _a-0000d965-94ed-8000-927a-010000010000_497 "LR_getCellFromLatestRow"
    content _a-0000d96d-7ef0-8000-927a-010000010000_522 "LRP_listViewTitle"
    content _a-0000d96d-7ef0-8000-927a-010000010000_506 "Log Reader"
    content _a-0000d96d-7ef0-8000-927a-010000010000_507 "Log Reader Files"
    content _a-0000d96d-7ef0-8000-927a-010000010000_508 "Images"
    content _a-0000d96d-7ef0-8000-927a-010000010000_512 "all-good"
    content _a-0000d96d-7ef0-8000-927a-010000010000_513 "Images"
    content _a-0000d96d-7ef0-8000-927a-010000010000_514 "LR_IMG_ALLGOOD"
    content _a-0000d96d-7ef0-8000-927a-010000010000_510 "memorylow-diskok"
    content _a-0000d96d-7ef0-8000-927a-010000010000_515 "LR_IMG_MEMLOWDISKOK"
    content _a-0000d96d-7ef0-8000-927a-010000010000_509 "memorylow-disklow"
    content _a-0000d96d-7ef0-8000-927a-010000010000_516 "LR_IMG_MEMLOWDISKLOW"
    content _a-0000d96d-7ef0-8000-927a-010000010000_511 "memoryok-disklow"
    content _a-0000d96d-7ef0-8000-927a-010000010000_517 "LR_IMG_MEMOKDISKLOW"
    content _a-0000d96d-7ef0-8000-927a-010000010000_518 "LRP_listViewImage"
    content _a-0000d971-76d8-8000-927a-010000010000_538 "LRP_listViewDetails"
    content _a-0000d96d-7ef0-8000-927a-010000010000_502 "LRP_listView"
    content 20967afa-3bf8-4ec7-ad30-fa27de31d4c7 "LR_reportDiskPartition"
    content 7d305b97-0e7f-4425-9d8a-bc532aefa9cd "LR_reportLoadAverage"
    content 05f3bada-3583-4ba9-b0d5-a0fec98914ca "LR_reportHeapMemory"
    content _a-0000d965-94ed-8000-927a-010000010000_494 "LR_getLatestSystemCsvMetric"
    content _a-0000d95d-3f26-8000-927a-010000010000_393 "LR_getStartIndex"
    content 0ffe1725-3552-40b0-8ead-5b7bc47d0415 "LR_tempDashboard"
    content _a-0000d971-76d8-8000-927a-010000010000_531 "Reports"
    content _a-0000e58d-c17f-8000-5249-01ef9001ef90_7842 "LR_NUM_SYSTEM_HEALTH_MONITER_TIMER"
    content _a-0000e58d-c17f-8000-5249-01ef9001ef90_7829 "LR_getLatestSystemDesignError"
    content _a-0000d971-76d8-8000-927a-010000010000_533 "LR_IS_DEBUG"
    content _a-0000d971-76d8-8000-927a-010000010000_532 "Recent System Health Monitor Instances"
    content _a-0000d974-2bd1-8000-927a-010000010000_546 "LR_DOCURL_CDTSBYREFERENCE"
    content cec28edc-f288-4c1d-b5ed-9ead3c27da4c "LR_reportCDTsByReference"
    content 3bdbf258-0f38-478f-b537-657e402188bc "LRP_processDashboard"
    processModelFolder _g-0000d965-94f0-8000-927a-010000010000_1 "Log Reader"
    processModel 0004d965-a806-8000-927a-010000010000 "System Health Monitor"
    application _a-0000d94d-f0be-8000-927a-010000010000_341 "Log Reader Record Only 7.5"
    recordType af24d8b8-550c-4a1f-a961-51f40b1364e5 "System Log"
    recordType e1bc0aad-a91f-469c-a2ea-6b65694f8012 "System Health Monitor"
    tempoReport 48e8da37-ebc6-4603-91e7-deb8d7fecd37 "System Performance - Slow Expressions"
    tempoReport 94c9d79d-2044-4685-aa2e-749bf6fdf8d4 "System Performance - Slow Data Store Operations"
    tempoReport be512fef-3312-4c4d-9a18-8e0263234e24 "System Health - Disk Usage"
    tempoReport 145d6ae7-3dd7-4a46-9d4c-c3d91b13eef8 "System Health - Java Heap Memory"
    tempoReport 49bb70b1-29fb-4ece-ba6c-46fd55dafcd8 "System Health - Load Average"
    tempoReport c085c656-8afd-4185-9178-f3ae484b0310 "Best Practices Violations - CDTs byreference"

    Inspect completed in 2.28 seconds

  • Does this not work for the audit/design_objects.csv log? The rows return a null and the totalCount is -1

  • In the readcsvlog function and all its variants, the row results are returned by concatenating each field with the variable private static final String SEPARATOR, whose value is a comma. When concatenating values that contain a comma, there is no way to parse the results. If it is not possible to return the rows as an array of strings (with each field as an element), could an extension be made to allow passing the output separator value?

  • Anyone run into this error? I'm simply passing in pagingInfo to the recordTypeSource function through use of the a!query() function.

    Expression evaluation error at function 'systemlogsrecordtypesource' [line 7]: The passed parameter(s) are of the wrong type. Received the type com.appiancorp.common.xml.JaxbConversionException: JAXB failure trying to convert typed value TypedValue[it=1474,v={TypedValue[it=1478,v=<null>],TypedValue[it=1154,v=<null>],{1,101,<null>}}] to java class com.appiancorp.common.query.Query.

    Code Snippet:

    systemlogsrecordtypesource(
    a!query(pagingInfo: a!pagingInfo(startIndex: 1, batchSize: 101)
    )
    )

  • Hi, teams,

    I am trying to get a day's worth of rdbms-audit logs.
    However, I have tried the following expression, but could not get the logs that have been evacuated.
    Any help would be appreciated. Thanks in advance.

    Log format: rdbms-audit.log.yyyy-mm-dd.*

    readlogpaging( 
     logPath: "audit\rdbms\rdbms-audit.log." & tostring(year(today())) & "-" & substitute(    padleft(tostring(month(today())), 2),    " ",    "0"  ) & "-" & substitute(    padleft(tostring(day(today())), 2) & "." & tostring(pv!LogCounter),    " ",    "0"  ),
     startIndex: 1, 
     batchSize: - 1
    ).rows

  • We have an older version of this plugin and I see that another parameter has been added to the latest version of the plugin to address this issue. I'll give that a try.

  • We are trying to consume the rdbms-audit logs. We are using the function taillogpaging(). If you pass a timestampStop to this function, it does not return any data. The timestamp format in the rdbms-audit log is yyyymmdd hh:mm:ss. 

    We also use the taillogpaging() while consuming the tomcat-access logs and that log has a timestamp format of yyyy-mm-dd hh:mm:ss. This seems to work. 

    Any suggestions?

  • Hi Team,

    I am trying to get sites usage data from logs by using readcsvlog function but just getting headers and null for rows. Total count is coming as -1. Tried using readcsvlogpaging and readcsvlogpagingwithheaders functions too but that also didn't seem to work. 

    Not sure if there is anything to do with size of file as that log file is more than 6 mb. I am able to get data for other log files. Currently working on 24.2 version.

    PFA code snippet and output.

    Any help would be appreciated. Thanks in advance.

    Regards,

    Trunal Jain

  • Hi Team,

    Would it be possible to get last logged in (3 months ago ) user details by using this plugin?

    Thanks,

    Sai.

  • Hi 

    I've been using the Plug In function without issue - I find you have to specify all input values on the function. even if they are null. Some functions within the plug in seem to expect all inputs named even if they are null. There may also be some error output listed in STDOUT that can help determine what the issue is. 

    I've been using the readcsvlogpaging function without issue - if you try setting the other inputs to {} or NULL that may work. 

    fn!readcsvlogpaging(
    csvPath: "login-audit.csv",
    startIndex: ri!pagingInfo.startIndex,
    batchSize: ri!pagingInfo.batchSize,
    filterColumName: "Timestamp",
    filterOperator: "startsWith",
    filterValue: local!convertedToday,
    timestampColumnName: "Timestamp",
    timestampStart: now() - intervalds(0,ri!pastMinutes,0),
    timestampEnd: now()

    ),

    In my use case I'm only looking for Todays log in records and within a specified time frame - hence the use of timestamp filtering. 

    Hope this helps.