How to Read Retain Logs

  • 7020976
  • 03-Apr-2009
  • 18-Aug-2017

Environment

Retain 3.x/4.x
Linux, Windows, NetWare
Retain Server and Retain Worker

Situation

How do you read the Retain Server and the Retain Worker logs?

Resolution


The Retain Server and the Retain Worker logs serve the purpose of not only displaying information on what is being done in archiving the messages from your GroupWise system, but it also provides information for troubleshooting purposes.

The log files can be quite intimidating as they are chock full of information ranging from basic archive information of the system, SOAP and GroupWise connections, as well as java stack traces and elements of tomcat and apache.

Understanding a few basic elements of the log files can help to read these log files and make it a less daunting task.  It should be noted that, with every release, the logging messages change as developers try to provide more helpful diagnostic messages or add code that needs logging.  Thus, this article is a best effort guide.  We cannot guarantee that it will always be up to date with the latest changes.

Note: The log files discussed below are in diagnostic logging to provide as much information as possible. If you do not see the same type of information in the logs mentioned please set your logging level to diagnostic.



Log Location
See KB article, "Location of Log Files".

Basic Retain Logs
The Retain logs are a collaboration of elements of all that is running on and with the system. It contains information for the Retain program, java, SQL servers (MYSQL, Microsoft SQL 200/2005, Oracle, etc...), as well as tomcat and apache. They show you connection information to the Retain Worker, MYSQL server as well as the schedule information both for the Quartz scheduling as well as the profiles for Reload integration. If there are any error messages in the logs it can show in several different ways. One way is the java stack trace which is quite distinct from the rest of the log. The other is not so distinct and may say ERROR or WARN in the line. This usually indicates a problem with Retain itself while the first will be a GroupWise or other 3rd party issue. More on errors will be discussed below.

Viewing The Logs
Viewing the logs can be quite difficult depending on the program that you are viewing them in. In Linux you can easily tail the logs but it may not show you all of the information that you need to know. Using Notepad or generic text programs can make the logs look garbled and extremely difficult to read. Below are some text programs that are recommended for ease of usability and to easily view the log files:

Notepad: This program is found on all Windows workstations by default. It is great for small log files, and you can change the setup to word wrap if necessary. This is not recommended as it is not as sophisticated for viewing Retain logs as the other programs below. The information in the logs runs together and can be quite difficult to read.

WordPad:  This program, found on almost all Windows Workstations and servers, works great for smaller log files. It has a word wrap feature that can help in viewing the information quickly and is quite easy to read.

TextPad  This text editor is offered with a trial download (full featured) that is installed on your Windows machine. It is better for larger log files (up to 1 GB) and has automatic features to display line by line each of the log files information.  Once the trial period is complete, they prompt for a purchase but - to date - do not enforce it.  The program continues to operate full featured.

Notepad ++:  Very similar to Textpad which is very helpful for larger log files. This program, like Textpad, must be downloaded and installed before use. It has search features that rival Wordpad and Textpad.   The issue you'll run into with Notepad ++ is that it is limited to opening files only up to 1GB; however, it distributes that amount over all open files. So if you have one document open, it can be up to 1GB.  If you have two files open, it can be split between 500MB and 500MB or something like 800MB and 200MB and so forth. One of its nice features is that search results show in a separate pane; and, by double-clicking on any search hit in the search results pane will take the cursor right to the point in the main pane (where the log is loaded) to the exact point of that search hit.

Glogg:  Some of our tech support engineers use this log reader because it seems to be able to handle larger files than the other tools; however, it does not appear to be as feature rich.  There are log splitting utilities that will break up large log files into smaller more manageable parts.

Gedit. This is Linux only. Can be great for small log files. If the file is too large it may take quite some time to pull up in this text editor. It may be easier to move the log file to a Windows machine and use a Windows-based text editor instead for viewing.

There are many other text editors out there.  You may want to do your research - the intent of mentioning a few of them is to give you ideas. 

Retain Worker Log
The Retain Worker is found in the same directory as the Retain Server if they are both installed on the same server. However, the Retain Worker can also be on a remote server, which then may change the location of the log file.

The Retain Worker log is a good place to look to see that the Retain Server has contacted the Worker and started the job.

Searching for Errors
If you just want to search for errors that occurred one by one, then simply search for "[ERROR]" (literally including the square brackets; however, this requires that you set up your logging to log it in this format).  See our KB, "Logging Configuration Change to Facilitate Easier Archive Job Error Identification".  Searching on "[ERROR]" will take you right to the point when the error occurred.  You can then look around that area (before and after) to get all of the details.  If you look above the error several lines, you should be able to determine which message or attachment or folder is was working on when the error occurred.

Finding Key Information About the Mailbox Job
The logs in Retain 4 have changed significantly, so where there are differences, they'll be noted since not everyone will be upgrading from Retain 3 to Retain 4 right away.  Developers are constantly changing logging and Support provides feedback on what we would like to see, so we will try to keep this article updated as things change.  It should be assumed that these tips reflect how logging works in the most current version of Retain.

Here are some key words to search on to find key information:

Job Start

Retain 3:  Beginning the dredging saga of [job name]
Retain 4:  Starting scheduled Archive job [job ID]

That is the beginning of the job. Delete everything above the job start line and save the log.  This eliminates needless log chatter prior to the job start; however, if the job started in the evening of day1 but did not end until sometime during day2, then the job will be split among two separate logs.  Retain rolls the logs at midnight.  The existing log is compressed into a zip file (default log setting) and a new log is created.

Job Completion

Retain 3:  job ended gracefully
Retain 4:  JobRun ended successfully

Delete everything after the this job completion line and save the log.  This marks the end of the archive job.  Deleting everything after that phrase, again, eliminates needless log chatter.

Entering a Mailbox

Retain 3:  Logging in as: [mailbox]
Retain 4:  Logging in as : [mailbox]  (note the additional space between "as" and the colon character)

This is where Retain enters the user mailbox to begin archiving its contents.  If you are researching just a single mailbox issue, search for that user's mailbox:  logging in as: [mailbox].  Delete everything before that line; then, search for "logging in as" without specifying a mailbox name.  This gets you to the next mailbox after the one you are researching.  Delete everything after that point.  This just leaves you with a log of only that one user's mailbox.  If you do this, just save your log with a different name so as to avoid overwriting the original log.

Finishing a Mailbox

Date Chosen:

This is the date used for the item store flag (Exchange) or retention flag (GroupWise).

Errors

[ERROR]  (Literally including the square brackets; however, this requires that you set up your logging to log it in this format).

See our KB, "Logging Configuration Change to Facilitate Easier Archive Job Error Identification".  Searching on "[ERROR]" will take you right to the point when the error occurred.

preventAdvanceFlag

This will show the line where you'll see "preventAdvanceFlag: n" (among other things).  If the number is "1", then the error prevented the Retention or Item Store Flag from being advanced.  This would be a concern.  If the number is "0", then it did not and you do not need to worry about the error.  The item should have been archived.

Module-specific Key Information
Exchange Systems

MailboxArchivingStats - This item may prevent

This lists any statements indicating that the item store flag will not be advanced due to the error that was just recorded.  This helps you find serious errors.

ProcessExchFilters - storageDateRange =

This provides the mail item search range that Retain will use for the given mailbox.  Similar to the "Delivered GTE" and "Delivered LTE" statements in the GroupWise job logs (see below).

For a more detailed explanation of reading a Worker log for an Exchange/O365 system, see "How to Read Retain Worker Logs (Exchange / O365 Jobs)".
GroupWise Systems

delivered GTE

This provides the mail item beginning search range that Retain will use for the given mailbox.

delivered LTE

This provides the mail item ending search range that Retain will use for the given mailbox.

Gmail (Google Apps)

GmailDredger - GmailDredger.archiveMessage():

This is the call it makes for each message and for each attachment. 

For messages, it reads:  GmailDredger - GmailDredger.archiveMessage() called for:

It will show the user email address followed by the subject line of the message.

For attachments, it reads:  GmailDredger - GmailDredger.archiveMessage() about to process attachments.

storageDateRange

This will show you the date range for items that we are passing onto Gmail.


Retain Server Log

The Retain Server log shows information of connections made by the Retain Worker, job scheduling, SQL queries, as well as indexes for the SQL server you are running on your system. It also shows you the address book and all of the users on it's initial connection. These elements are helpful in understanding what the Retain Server is doing with the archived messages. The Retain Server also shows information on the Deletion Management. Below is a line from the Retain Server log:

2009-03-04 01:00:00,024 [RTSQuartzScheduler_Worker-1] DEBUG com.maintainet.jobs.QuartzJobController - Registering Job with name: Maintainer

Each line in the Retain Server log starts with the date and time of the process or thread. The next section is the process that the Retain Server is running during that time.  Depending on the logging level of the Retain Server it can show a DEBUG or nothing. Since this log was in diagnostic logging it shows Debug. The last part of the line shows what the process is doing. In this case it is registered the job with the Maintainer-or the configuration. Each line will have this same basic information.

2009-02-23 01:02:00,029 [RTSQuartzScheduler_Worker-1] INFO  com.maintainet.jobs.MaintenanceJob - Begin Maintain @Mon Feb 23 01:02:00 MST 2009
2009-02-23 01:02:00,029 [RTSQuartzScheduler_Worker-1] INFO  com.maintainet.jobs.MaintenanceJob - Begin clean DB
2009-02-23 01:02:00,062 [RTSQuartzScheduler_Worker-1] INFO  com.maintainet.jobs.MaintenanceJob - End AB Clean
2009-02-23 01:02:00,062 [RTSQuartzScheduler_Worker-1] INFO  com.maintainet.jobs.MaintenanceJob - Begin user expiration
2009-02-23 01:02:00,078 [RTSQuartzScheduler_Worker-1] INFO  com.gwava.authenticate.Authenticator - Expire Days are: 2592000
2009-02-23 01:02:00,094 [RTSQuartzScheduler_Worker-1] INFO  com.maintainet.jobs.MaintenanceJob - End user expiration
2009-02-23 01:02:00,094 [RTSQuartzScheduler_Worker-1] INFO  com.maintainet.jobs.MaintenanceJob - Backing up Server cfg
2009-02-23 01:02:00,095 [RTSQuartzScheduler_Worker-1] INFO  com.maintainet.jobs.MaintenanceJob - Backup of Server cfg complete
2009-02-23 01:02:00,095 [RTSQuartzScheduler_Worker-1] INFO  com.maintainet.jobs.MaintenanceJob - Begin backup of ebdb
2009-02-23 01:02:00,101 [RTSQuartzScheduler_Worker-1] INFO  com.maintainet.jobs.MaintenanceJob - Backup of ebdb disabled
2009-02-23 01:02:00,101 [RTSQuartzScheduler_Worker-1] INFO  com.maintainet.jobs.MaintenanceJob - End backup of ebdb
2009-02-23 01:02:00,101 [RTSQuartzScheduler_Worker-1] INFO  com.maintainet.jobs.MaintenanceJob - Doing compression...
2009-02-23 01:02:00,106 [RTSQuartzScheduler_Worker-1] TRACE com.gwava.db.DerbyUtil - Compressing Derby...
2009-02-23 01:02:00,764 [RTSQuartzScheduler_Worker-1] TRACE com.gwava.db.DerbyUtil - Compressing Derby...
2009-02-23 01:02:02,242 [RTSQuartzScheduler_Worker-1] INFO  com.maintainet.jobs.MaintenanceJob - Derby compression completed
2009-02-23 01:02:02,264 [RTSQuartzScheduler_Worker-1] INFO  com.maintainet.jobs.MaintenanceJob - End compression of ebdb
2009-02-23 01:02:02,264 [RTSQuartzScheduler_Worker-1] INFO  com.maintainet.jobs.MaintenanceJob - Begin index backup
2009-02-23 01:02:02,291 [RTSQuartzScheduler_Worker-1] INFO  com.maintainet.jobs.MaintenanceJob - Index backup disabled
2009-02-23 01:02:02,291 [RTSQuartzScheduler_Worker-1] INFO  com.maintainet.jobs.MaintenanceJob - End index backup
2009-02-23 01:02:02,291 [RTSQuartzScheduler_Worker-1] INFO  com.maintainet.jobs.MaintenanceJob - Doing index optimization...
2009-02-23 01:02:02,297 [RTSQuartzScheduler_Worker-1] INFO  com.maintainet.jobs.MaintenanceJob - End optimization of index
2009-02-23 01:02:02,313 [RTSQuartzScheduler_Worker-1] WARN  com.gwava.deletion.DeletionTask - DeletionJob scheduled but no settings found... stopping job.
2009-02-23 01:02:02,315 [RTSQuartzScheduler_Worker-1] INFO  com.maintainet.jobs.MaintenanceJob - End Maintain @Mon Feb 23 01:02:02 MST 2009
2009-02-23 01:02:02,315 [RTSQuartzScheduler_Worker-1] INFO  com.maintainet.jobs.MaintenanceJob - Begin BG Index Catchup
2009-02-23 01:02:02,328 [RTSQuartzScheduler_Worker-1] DEBUG root - Server/Indexing set loglevel to: ALL
2009-02-23 01:02:02,331 [RTSQuartzScheduler_Worker-1] INFO  com.maintainet.jobs.MaintenanceJob - End BG Index Catchup
2009-02-23 01:02:02,332 [RTSQuartzScheduler_Worker-1] DEBUG com.maintainet.jobs.MaintenanceJob - Running MaintenanceJob...done
2009-02-23 01:02:02,332 [RTSQuartzScheduler_Worker-1] DEBUG com.maintainet.jobs.QuartzJobController - Deregistering Job with name: Maintainer
2009-02-23 01:02:02,342 [RTSQuartzScheduler_Worker-1] DEBUG root - Server/Indexing set loglevel to: ALL
2009-02-23 01:02:02,345 [RTSQuartzScheduler_Worker-1] INFO  com.maintainet.jobs.MaintenanceJob - Running SyncABookJob in MaintenanceJob...
2009-02-23 01:02:02,356 [RTSQuartzScheduler_Worker-1] DEBUG root - Server/Indexing set loglevel to: ALL
2009-02-23 01:02:02,412 [RTSQuartzScheduler_Worker-1] DEBUG com.maintainet.utils.ReloadingProperties - ReloadingProperties decodedServletFilePath: null
2009-02-23 01:02:02,413 [RTSQuartzScheduler_Worker-1] DEBUG com.maintainet.gweasysoap.EasySoap - EasySoap.class.getResource /useHTTPTunnel.properties succeeded
2009-02-23 01:02:02,784 [RTSQuartzScheduler_Worker-1] DEBUG com.maintainet.gweasysoap.AbstractEasySoap - [EasySoap.getValidUser]: accounting
2009-02-23 01:02:02,792 [RTSQuartzScheduler_Worker-1] DEBUG com.maintainet.gweasysoap.EasySoap - EasySoap.class.getResource /useHTTPTunnel.properties succeeded
2009-02-23 01:02:03,090 [RTSQuartzScheduler_Worker-1] ERROR com.maintainet.gweasysoap.AbstractEasySoap - getAnyUser
com.maintainet.gweasysoap.EasySoapException: User Database is temporarily disabled , Code: d714, info: null
    at com.maintainet.gweasysoap.EasySoap.fire(EasySoap.java:372)
    at com.maintainet.gweasysoap.EasySoap.login_(EasySoap.java:338)
    at com.maintainet.gweasysoap.EasySoap.<init>(EasySoap.java:180)
    at com.maintainet.gweasysoap.GWSoapClient.<init>(GWSoapClient.java:23)
    at com.maintainet.gweasysoap.AbstractEasySoap.getValidUser(AbstractEasySoap.java:194)
    at com.maintainet.jobs.SyncABookJob.processJob(SyncABookJob.java:363)
    at com.maintainet.jobs.MaintenanceJob.handleAddressBookSync(MaintenanceJob.java:157)
    at com.maintainet.jobs.MaintenanceJob.execute(MaintenanceJob.java:145)
    at org.quartz.core.JobRunShell.run(JobRunShell.java:203)
    at org.quartz.simpl.SimpleThreadPool$WorkerThread.run(SimpleThreadPool.java:520)
2009-02-23 01:02:03,091 [RTSQuartzScheduler_Worker-1] DEBUG com.maintainet.gweasysoap.AbstractEasySoap - [EasySoap.getValidUser]: admin
2009-02-23 01:02:03,099 [RTSQuartzScheduler_Worker-1] DEBUG com.maintainet.gweasysoap.EasySoap - EasySoap.class.getResource /useHTTPTunnel.properties succeeded
2009-02-23 01:02:03,327 [RTSQuartzScheduler_Worker-1] INFO  com.maintainet.gweasysoap.EasySoap - GW-Version: 8.0.0 , build: 84910, AttachmentOverHTTPSupported: true
2009-02-23 01:02:03,446 [RTSQuartzScheduler_Worker-1] INFO  com.maintainet.gweasysoap.EasySoap - createCursorRequest called: GroupWiseSystemAddressBook@52
2009-02-23 01:02:03,520 [RTSQuartzScheduler_Worker-1] INFO  com.maintainet.gweasysoap.EasySoap - ReadCursorResponse items:1
2009-02-23 01:02:03,520 [RTSQuartzScheduler_Worker-1] INFO  com.maintainet.jobs.SyncABookJob - Group
2009-02-23 01:02:03,574 [RTSQuartzScheduler_Worker-1] INFO  com.maintainet.gweasysoap.EasySoap - ReadCursorResponse items:0
2009-02-23 01:02:03,626 [RTSQuartzScheduler_Worker-1] INFO  com.maintainet.gweasysoap.EasySoap - closing cursor for these many read items: 1
2009-02-23 01:02:03,682 [RTSQuartzScheduler_Worker-1] INFO  com.maintainet.gweasysoap.EasySoap - createCursorRequest called: GroupWiseSystemAddressBook@52
2009-02-23 01:02:03,766 [RTSQuartzScheduler_Worker-1] INFO  com.maintainet.gweasysoap.EasySoap - ReadCursorResponse items:4
2009-02-23 01:02:03,881 [RTSQuartzScheduler_Worker-1] INFO  com.maintainet.gweasysoap.EasySoap - ReadCursorResponse items:0
2009-02-23 01:02:03,930 [RTSQuartzScheduler_Worker-1] INFO  com.maintainet.gweasysoap.EasySoap - closing cursor for these many read items: 4
2009-02-23 01:02:04,012 [RTSQuartzScheduler_Worker-1] INFO  com.maintainet.jobs.MaintenanceJob - Running SyncABookJob in MaintenanceJob...done
2009-02-23 01:02:45,504 [TP-Processor16] TRACE com.gwava.utils.ServerController - writing to logger...

You can notice that an ERROR shows up and is quite distinct from the rest of the log. This stack trace as it is called can help to identify the error and what caused it:

2009-02-23 01:02:03,090 [RTSQuartzScheduler_Worker-1] ERROR com.maintainet.gweasysoap.AbstractEasySoap - getAnyUser
com.maintainet.gweasysoap.EasySoapException: User Database is temporarily disabled , Code: d714, info: null
    at com.maintainet.gweasysoap.EasySoap.fire(EasySoap.java:372)
    at com.maintainet.gweasysoap.EasySoap.login_(EasySoap.java:338)
    at com.maintainet.gweasysoap.EasySoap.<init>(EasySoap.java:180)
    at com.maintainet.gweasysoap.GWSoapClient.<init>(GWSoapClient.java:23)
    at com.maintainet.gweasysoap.AbstractEasySoap.getValidUser(AbstractEasySoap.java:194)
    at com.maintainet.jobs.SyncABookJob.processJob(SyncABookJob.java:363)
    at com.maintainet.jobs.MaintenanceJob.handleAddressBookSync(MaintenanceJob.java:157)
    at com.maintainet.jobs.MaintenanceJob.execute(MaintenanceJob.java:145)
    at org.quartz.core.JobRunShell.run(JobRunShell.java:203)
    at org.quartz.simpl.SimpleThreadPool$WorkerThread.run(SimpleThreadPool.java:520)

First of all stack traces like this are read from the bottom to the top, with the top being the last process that was done by Retain. You can see in this error message that it is reporting  a SOAP issue. This process will always be listed followed by the actual error message. "User Database is temporarily disabled.." After that if there is an error code it will display it. This one is d714 which refers to a GroupWise error. The rest of the trace are the other processes that it was running when it received the error.

If you have multiple workers it will be more difficult to interprete logs if the workers are running at the same time as they will load information into the server log at that same time. However, you will be able to trace individual messages by the Store_############# tag

2014-10-03 03:30:32,430 [Store_1412332232429] INFO  com.gwava.archive.StoreEmail - #begin archiving: 3F8EEC90AA63F686F8F13944BFE99467 4567FDE4.EUHSD1.PODO1.200.20000A1.1.3E1.1 220EF5347A5446405167C61FDD0189FE8CF519C6CA9592F6B1C5349E9DB54BFE
2014-10-03 03:30:32,430 [Store_1412332232429] INFO  com.gwava.archive.StoreEmail - userID: rclay
2014-10-03 03:30:32,471 [Store_1412332232429] ERROR org.hibernate.util.JDBCExceptionReporter - Deadlock found when trying to get lock; try restarting transaction
2014-10-03 03:30:32,471 [Store_1412332232429] WARN  com.gwava.engine.RetainDBStorageEngine - Clearing caches to avoid poisoning
2014-10-03 03:30:32,480 [Store_1412332232429] ERROR com.gwava.utils.ServerErrorHandlerStrategy - reportError: StoreEmail :: com.gwava.archive.StoreEmail.handleArchiveExceptions:566 :: EXCEPTION : org.hibernate.exception.LockAcquisitionException: could not insert: [com.gwava.dao.social.MessageProperty] org.hibernate.exception.LockAcquisitionException: could not insert: [com.gwava.dao.social.MessageProperty]
    at org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:107)
    at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:66)
    at org.hibernate.id.insert.AbstractReturningDelegate.performInsert(AbstractReturningDelegate.java:64)
    at org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:2345)
    at org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:2852)
    at org.hibernate.action.EntityIdentityInsertAction.execute(EntityIdentityInsertAction.java:71)
    at org.hibernate.engine.ActionQueue.execute(ActionQueue.java:273)
    at org.hibernate.event.def.AbstractSaveEventListener.performSaveOrReplicate(AbstractSaveEventListener.java:320)
    at org.hibernate.event.def.AbstractSaveEventListener.performSave(AbstractSaveEventListener.java:203)
    at org.hibernate.event.def.AbstractSaveEventListener.saveWithGeneratedId(AbstractSaveEventListener.java:129)
    at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.saveWithGeneratedOrRequestedId(DefaultSaveOrUpdateEventListener.java:210)
    at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.entityIsTransient(DefaultSaveOrUpdateEventListener.java:195)
    at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.performSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:117)
    at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.onSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:93)
    at org.hibernate.impl.SessionImpl.fireSaveOrUpdate(SessionImpl.java:685)
    at org.hibernate.impl.SessionImpl.saveOrUpdate(SessionImpl.java:677)
    at org.hibernate.engine.CascadingAction$5.cascade(CascadingAction.java:252)
    at org.hibernate.engine.Cascade.cascadeToOne(Cascade.java:392)
    at org.hibernate.engine.Cascade.cascadeAssociation(Cascade.java:335)
    at org.hibernate.engine.Cascade.cascadeProperty(Cascade.java:204)
    at org.hibernate.engine.Cascade.cascadeCollectionElements(Cascade.java:425)
    at org.hibernate.engine.Cascade.cascadeCollection(Cascade.java:362)
    at org.hibernate.engine.Cascade.cascadeAssociation(Cascade.java:338)
    at org.hibernate.engine.Cascade.cascadeProperty(Cascade.java:204)
    at org.hibernate.engine.Cascade.cascade(Cascade.java:161)
    at org.hibernate.event.def.AbstractSaveEventListener.cascadeAfterSave(AbstractSaveEventListener.java:475)
    at org.hibernate.event.def.AbstractSaveEventListener.performSaveOrReplicate(AbstractSaveEventListener.java:353)
    at org.hibernate.event.def.AbstractSaveEventListener.performSave(AbstractSaveEventListener.java:203)
    at org.hibernate.event.def.AbstractSaveEventListener.saveWithGeneratedId(AbstractSaveEventListener.java:129)
    at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.saveWithGeneratedOrRequestedId(DefaultSaveOrUpdateEventListener.java:210)
    at org.hibernate.event.def.DefaultSaveEventListener.saveWithGeneratedOrRequestedId(DefaultSaveEventListener.java:56)
    at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.entityIsTransient(DefaultSaveOrUpdateEventListener.java:195)
    at org.hibernate.event.def.DefaultSaveEventListener.performSaveOrUpdate(DefaultSaveEventListener.java:50)
    at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.onSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:93)
    at org.hibernate.impl.SessionImpl.fireSave(SessionImpl.java:713)
    at org.hibernate.impl.SessionImpl.save(SessionImpl.java:701)
    at org.hibernate.impl.SessionImpl.save(SessionImpl.java:697)
    at com.gwava.engine.RetainDBStorageEngine.insertMessage(RetainDBStorageEngine.java:987)
    at com.gwava.engine.RetainDBStorageEngine.dbStore2(RetainDBStorageEngine.java:418)
    at com.gwava.engine.RetainDBStorageEngine.dbStore1(RetainDBStorageEngine.java:271)
    at com.gwava.engine.RetainDBStorageEngine.dbStore(RetainDBStorageEngine.java:144)
    at com.gwava.datastore.client.SingleProcessStorageEngine.archiveEmail(SingleProcessStorageEngine.java:101)
    at com.gwava.archive.StoreEmail.handlePUT(StoreEmail.java:324)
    at org.apache.jsp.Server.index_jsp._jspService(Unknown Source)
    at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:722)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:305)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
    at com.gwava.Filters.ResponseFilter.doFilter(ResponseFilter.java:48)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
    at com.gwava.Filters.MainFilter.doFilter(MainFilter.java:293)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:225)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:123)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:168)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:98)
    at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:927)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:407)
    at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1001)
    at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:585)
    at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:312)
    at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)
    at java.lang.Thread.run(Thread.java:662)
Caused by: com.mysql.jdbc.exceptions.jdbc4.MySQLTransactionRollbackException: Deadlock found when trying to get lock; try restarting transaction
    at sun.reflect.GeneratedConstructorAccessor10849.newInstance(Unknown Source)
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27)
    at java.lang.reflect.Constructor.newInstance(Constructor.java:513)
    at com.mysql.jdbc.Util.handleNewInstance(Util.java:411)
    at com.mysql.jdbc.Util.getInstance(Util.java:386)
    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1065)
    at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:4074)
    at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:4006)
    at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:2468)
    at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2629)
    at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2719)
    at com.mysql.jdbc.PreparedStatement.executeInternal(PreparedStatement.java:2155)
    at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:2450)
    at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:2371)
    at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:2355)
    at com.mchange.v2.c3p0.impl.NewProxyPreparedStatement.executeUpdate(NewProxyPreparedStatement.java:147)
    at org.hibernate.id.IdentityGenerator$GetGeneratedKeysDelegate.executeAndExtract(IdentityGenerator.java:94)
    at org.hibernate.id.insert.AbstractReturningDelegate.performInsert(AbstractReturningDelegate.java:57)
    ... 64 more

2014-10-03 03:30:32,501 [Store_1412332232429] ERROR com.gwava.archive.StoreEmail - Above error occurred while processing:<com.maintainet.archive.ASDoc>
  <fileName>GWAVA message restriction digest.txt</fileName>
  <meta>
    <property name="msgid" value="4567FDE4.EUHSD1.PODO1.200.20000A1.1.3E1.1"/>
    <property name="subject" value="GWAVA message restriction digest"/>
    <property name="uuid" value="F3B88E82-176E-0000-B8ED-9F0026005E00"/>
    <property name="personalSubject" value=""/>
    <property name="senderDisplay" value="&lt;EUHSDGWAVA&gt;"/>
    <property name="abSystem" value="gw"/>
    <property name="from" value=""/>
    <property name="expireDays" value="0"/>
    <property name="dirPathIDStr" value="\Root\Trash"/>
    <property name="archiverID" value="3F8EEC90AA63F686F8F13944BFE99467"/>
    <property name="contentType" value="bodytext/plain"/>
    <property name="friendlyname" value="PODSC"/>
    <property name="folderID" value="9.EUHSD1.PODO1.100.0.1.0.1@18"/>
    <property name="priority" value="Standard"/>
    <property name="attachmentCount" value="0"/>
    <property name="item.class" value="com.novell.groupwise.ws2.Mail"/>
    <property name="recipients" value="2:Bob Clay:rclay@euhsd.k12.ca.us: ;"/>
    <property name="compressedSize" value="71"/>
    <property name="categories" value=""/>
    <property name="filesize" value="56"/>
    <property name="status" value="deleted"/>
    <property name="internet" value="true"/>
    <property name="isSubmail" value="false"/>
    <property name="filename" value="GWAVA message restriction digest.txt"/>
    <property name="password" value="RlVHWUFGRUdCRkNVRlpTSlNDTENL"/>
    <property name="itemTypeString" value="Mail"/>
    <property name="boxTypeString" value="received"/>
    <property name="finalpart" value="no"/>
    <property name="archiver" value="RetainWorker"/>
    <property name="created" value="1164471888"/>
    <property name="hash" value="220EF5347A5446405167C61FDD0189FE8CF519C6CA9592F6B1C5349E9DB54BFE"/>
    <property name="userid" value="rclay"/>
    <property name="jobid" value="8A3C4B084BA4EEC02F1B20A2D410FC26"/>
    <property name="dirPath" value="\Bob Clay Home\Trash"/>
    <property name="delivered" value="1164471908"/>
    <property name="emailSystem" value="gw"/>
  </meta>
  <category></category>
  <createdDate>1412332232</createdDate>
  <modifiedDate>1412332232</modifiedDate>
  <creator>null</creator>
  <archiver>RetainWorker</archiver>
  <archiverID>3F8EEC90AA63F686F8F13944BFE99467</archiverID>
  <serverName>null</serverName>
  <size>56</size>
  <compressedSize>71</compressedSize>
  <volume>null</volume>
  <dirPath>\Bob Clay Home\Trash</dirPath>
  <dirPathIDs>\Root\Trash</dirPathIDs>
  <zid>noZID</zid>
  <trustees/>
  <catVolID>0</catVolID>
  <encryptionMethod>none</encryptionMethod>
  <compressionMethod>none</compressionMethod>
  <retention>0</retention>
</com.maintainet.archive.ASDoc>
2014-10-03 03:30:32,501 [Store_1412332232429] INFO  com.gwava.archive.StoreEmail - #done archiving: 4567FDE4.EUHSD1.PODO1.200.20000A1.1.3E1.1 220EF5347A5446405167C61FDD0189FE8CF519C6CA9592F6B1C5349E9DB54BFE
2014-10-03 03:31:52,643 [Store_1412332232429] INFO  jsp.server.index - ==========================================================================================


Each of the logs and errors will display something very similar to this. At times, certain errors might just show a [WARN]. But critical or fatal errors will display [ERROR] and provide you more information. Additional Logs

There are more logs with Retain that may be helpful. They are not used as often as the Retain Server and Retain Worker log but can still be a great help in troubleshooting certain problems.

The Indexer.log is a log that shows the maintenance and indexing performed by Retain. This is helpful to see what indexing has been done on the Retain system that day. Be warned there is only one indexing log per day for this, unlike the Retain Server and Retain Worker logs. This log is found in the same location as the Retain Server logs.

Tomcat, Apache, Catalina, SQL server logs can also be very helpful in troubleshooting each of those products. GWAVA technicians may use these to help troubleshoot certain areas of Retain. The tomcat and apache logs are found within the respected apache or tomcat directories. Catalina sits side by side with the tomcat logs. The SQL server logs are usually found where the program is installed.

If you suspect there are errors within Retain, consult the log files. If you need extra assistance with reading log files contact a GWAVA technical support and they can help you to determine errors or help with viewing and understanding the logs.

Additional Information

This article was originally published in the GWAVA knowledgebase as article ID 1113.