• Status: Solved
  • Priority: Medium
  • Security: Public
  • Views: 1778
  • Last Modified:

How to add carriage return, line feed in CF ADMIN LOG display

Errors logs in CF Admin word wrap. I'd rather be able to add a line feed wherever I want when formatting the error from the error handler. How? Can't get it to work with CHR's or <br>'s, etc.

Here's the example CF Error log report:

----------
Larry_Connors Invalid CFML construct found on line 1 at column 16. ColdFusion was looking at the following text:<p>''</p><p>The CFML compiler was processing:<ul><li>A cfset tag beginning on line 1, column 2.</ul> <br>The error occurred on line -1.
----------
The error was thrown on purpose for a test: <cfset nnd = 1
It's the only code on that cfm test page. Nothing else so, I'm also wondering, while not as important, why the paragraph tags are appearing in the log report There are none in the code on that page or the handler.
<!--- In an attempt to get a line feed in the log report, this doesn't work --->
 
#USER# #CHR(13)# #CHR(10)#
#error.diagnostics#
 
<!--- Nor does this: --->
 
<BR><BR> <!--- Just displays the <BR>'s --->
#error.diagnostics#

Open in new window

0
Janrow
Asked:
Janrow
  • 13
  • 6
  • 2
1 Solution
 
black0psCommented:
I'm not too sure where it is you are seeing these logs, but it sounds like you might have an error on the template that your cferror tag is calling. Can you post the entire error handler page code?
0
 
JanrowAuthor Commented:
There's not much to it. This is the error handler defined in CF ADMIN:


<cfsavecontent variable="vError">
<CFOUTPUT>
#error.diagnostics#
</CFOUTPUT>
</cfsavecontent> 
<cfoutput>#error.diagnostics#</cfoutput> 
<cflog text= "#vError#" file="Application" type="error"> 

Open in new window

0
 
JanrowAuthor Commented:
As I said in my first line, Errors logs in CF Admin. Open CF Admin and go to LOG FILES. I read them by clicking on File Name. Isn't that they way to do it? What other log files are in CF Admin?
0
Veeam and MySQL: How to Perform Backup & Recovery

MySQL and the MariaDB variant are among the most used databases in Linux environments, and many critical applications support their data on them. Watch this recorded webinar to find out how Veeam Backup & Replication allows you to get consistent backups of MySQL databases.

 
azadisaryevCommented:
logs are displayed in cf admin as plain text, so any html tags you have in the log message are not rendered. <cflog> tag also removes any plain-text linebreaks you may try to add into your log message, because, technically, these .log files are CSV (comma-separated values) files.

but you can easily create your own log reader with cf!
here are 2 good starting points:
http://www.coldfusionjedi.com/index.cfm/2007/12/20/Parsing-an-IIS-log-file-in-ColdFusion
http://www.coldfusionjedi.com/index.cfm/2007/9/11/Slow-page-report--Doing-it-with-ColdFusion-8

it is super-easy, actually.

there is also http://flogr.riaforge.org - a flex cf log parser app by Scott Stroz. it requires MS SQL db on the back-end. I have not used it, however, so can't say how good it is...

hth
0
 
azadisaryevCommented:
here's something i put together today (decided i could do with one, too)...
a custom-made, HTML-supporting CF Log Viewer.

save the code as a .cfm file.  
requires SESSIONMANAGEMENT to be turned on in cf admin...

not perfect, but good for a quick one...

enjoy.
<cfprocessingdirective suppresswhitespace="yes">
<a name="top"></a>
<cfset logsdir = server.coldfusion.rootdir & "/logs/">
<cfset templogsdir = GetDirectoryFromPath(GetTemplatePath()) & "customlogparser_tempdir">
<!---  --->
<cfparam name="url.logfile" default="">
<cfparam name="url.sr" default="1">
<cfparam name="url.rows" default="5">
<cfset collist = "severity,threadid,log_date,log_time,log_app,message">
<!---  --->
<cfif url.logfile neq "">
	<cfif NOT structkeyexists(session, 'logparser')><cfset session.logparser = {}></cfif>
	<cfset logname = rereplace(left(url.logfile, len(url.logfile)-4), "[^[:alnum:]]", "_", "ALL")>
	<cfset newname = left(url.logfile, len(url.logfile)-4) & ".txt">
	<cfif fileexists(logsdir & url.logfile)>
		<cfif NOT fileexists(templogsdir & "\" & newname)>
			<cffile action="copy" source="#logsdir & url.logfile#" destination="#templogsdir#\#newname#">
		</cfif>
		<cfif NOT structkeyexists(session.logparser, logname)>
			<cfhttp url="http://#cgi.HTTP_HOST & removechars(getdirectoryfrompath(cgi.SCRIPT_NAME), 1, 1)#/customlogparser_tempdir/#newname#" name="tempq" method="get" getasbinary="no" columns="#collist#"></cfhttp>
			<cfquery name="session.logparser.#logname#" dbtype="query">
			SELECT #collist#,(log_date + ' ' + log_time) AS log_datetime
			FROM tempq 
			ORDER BY log_datetime DESC
			</cfquery>
		</cfif>
	<cfelse>
		<cfoutput>
			<h3>Can't find requested log file...</h3>
			<a href="#cgi.SCRIPT_NAME#" title="back to logs list" style="text-decoration:none;color:##333;font-weight:bold;">&laquo;Back to Logs list</a>
		</cfoutput>
		<cfabort>
	</cfif>
	<!---  --->
	<cfparam name="maxlogrows" default="#url.rows#">
	<cfset myQ = session.logparser['#logname#']>
	<cfset ttlrows = myQ.recordcount>
	<cfset modrows = ttlrows mod maxlogrows>
	<table width="80%" border="0" cellpadding="2" cellpadding="1" align="center">
	<!--- table header --->
	<tr><td colspan="5" align="left" style="padding-bottom:8px;"><a href="<cfoutput>#getfilefrompath(cgi.SCRIPT_NAME)#</cfoutput>" title"back to logs list" style="font-weight:bold;font-size:90%;text-decoration:none;color:#333;">&laquo;Back to logs list</a></td></tr>
	<tr><td colspan="5" align="center" valign="middle" style="padding:8px 0;background:#333;color:#fff;font-size:90%;">
	<cfoutput>
	Log File: <strong>#url.logfile#</strong> &nbsp;&bull;&nbsp; Rows: <strong>#url.sr# - #min(ttlrows, url.sr+maxlogrows-1)# of #ttlrows#</strong> &nbsp;&bull;&nbsp; Show 
	<select name="showrows" id="showrows" size="1" style="font-weight:normal;border:1px solid black;" onChange="window.location.href='#getfilefrompath(cgi.SCRIPT_NAME)#?logfile=#url.logfile#&sr=1&rows='+this.value;">
	<option value="5" <cfif maxlogrows eq 5>selected="selected"</cfif>>5</option>
	<cfloop from="10" to="50" step="10" index="numrows">
	<option value="#numrows#" <cfif numrows eq maxlogrows>selected="selected"</cfif>>#numrows#</option>
	</cfloop>
	</select> rows / page
	</cfoutput>
	</td></tr>
	<!--- top navigation --->
	<tr>
		<td colspan="5" align="center" style="border-top:1px solid silver;border-bottom:1px solid silver;font-size:90%;">
		<cfoutput>
		<cfif url.sr gt 1>
		<a href="?logfile=#url.logfile#&sr=1&rows=#maxlogrows#" title="jump to first entry" style="text-decoration:none;color:##69f;">&laquo;&laquo;first</a>
		&nbsp;&nbsp;
		<a href="?logfile=#url.logfile#&sr=#max(1, url.sr-maxlogrows)#&rows=#maxlogrows#" title="previous #maxlogrows# entries" style="text-decoration:none;color:##69f;">&laquo;&ndash;#maxlogrows#</a> 
		<cfelse>
		<span style="color:##ccc;">&laquo;&laquo;first&nbsp;&nbsp;&laquo;&ndash;#maxlogrows#</span>
		</cfif>
		&nbsp;&bull;&nbsp; 
		<cfif url.sr+maxlogrows gt ttlrows>
		<span style="color:##ccc;">+#maxlogrows#&raquo;&nbsp;&nbsp;last&raquo;&raquo;</span>
		<cfelse>
		<a href="?logfile=#url.logfile#&sr=#min(ttlrows, url.sr+maxlogrows)#&rows=#maxlogrows#" title="next #maxlogrows# entries" style="text-decoration:none;color:##69f;">+#maxlogrows#&raquo;</a>
		&nbsp;&nbsp;
		<a href="?logfile=#url.logfile#&sr=#(fix(ttlrows/maxlogrows)*maxlogrows)+1#&rows=#maxlogrows#" title="jump to last entry" style="text-decoration:none;color:##69f;">last&raquo;&raquo;</a>
		</cfif>
		</cfoutput>
		</td>
	</tr>
	<!--- log header --->
	<tr style="background:#6cf;font-size:90%;">
		<th align="left" width="20%">Date</th>
		<th align="left" width="20%">Time</th>
		<th align="left" width="20%">Severity</th>
		<th align="left" width="20%">ThreadID</th>
		<th align="left" width="20%">Aplication Name</th>
	</tr>
	<!--- log data --->
	<cfoutput query="session.logparser.#logname#" startrow="#url.sr#" maxrows="#maxlogrows#">
	<tr style="background:##e4e4e4;font-size:80%;">
		<td><strong>#dateformat(log_date, "dd mmm yyyy")#</strong></td>
		<td><strong>#timeformat(log_time, "hh:mm:ss TT")#</strong></td>
		<td><strong>#severity#</strong></td>
		<td><strong>#threadid#</strong></td>
		<td><strong>#log_app#</strong></td>
	</tr>
	<tr>
		<td colspan="5" align="left" style="padding-top:4px;font-size:80%;">#rereplace(message, chr(60)&'('&chr(97)&'|'&chr(65)&') ', '&lt;\1 ', 'all')#<!--- #replace(message, '<' & chr(97) & ' ', '&lt;' & chr(97) & ' ', 'all')# ---></td>
	</tr>
	</cfoutput>
	<!--- bottom navigation --->
	<tr>
		<td colspan="5" align="center" style="border-top:1px solid silver;font-size:90%;">
		<cfoutput>
		<cfif url.sr gt 1>
		<a href="?logfile=#url.logfile#&sr=1&rows=#maxlogrows#" title="jump to first entry" style="text-decoration:none;color:##69f;">&laquo;&laquo;first</a>
		&nbsp;&nbsp;
		<a href="?logfile=#url.logfile#&sr=#max(1, url.sr-maxlogrows)#&rows=#maxlogrows#" title="previous #maxlogrows# entries" style="text-decoration:none;color:##69f;">&laquo;&ndash;#maxlogrows#</a> 
		<cfelse>
		<span style="color:##ccc;">&laquo;&laquo;first&nbsp;&nbsp;&laquo;&ndash;#maxlogrows#</span>
		</cfif>
		&nbsp;&bull;&nbsp; 
		<cfif url.sr+maxlogrows gt ttlrows>
		<span style="color:##ccc;">+#maxlogrows#&raquo;&nbsp;&nbsp;last&raquo;&raquo;</span>
		<cfelse>
		<a href="?logfile=#url.logfile#&sr=#min(ttlrows, url.sr+maxlogrows)#&rows=#maxlogrows#" title="next #maxlogrows# entries" style="text-decoration:none;color:##69f;">+#maxlogrows#&raquo;</a>
		&nbsp;&nbsp;
		<a href="?logfile=#url.logfile#&sr=#(fix(ttlrows/maxlogrows)*maxlogrows)+1#&rows=#maxlogrows#" title="jump to last entry" style="text-decoration:none;color:##69f;">last&raquo;&raquo;</a>
		</cfif>
		</cfoutput>
		</td>
	</tr>
	<!--- footer --->
	<tr>
		<td colspan="5" align="right" style="border-top:1px solid silver;padding-top:4px;padding-right:10px;"><a href="<cfoutput>#getfilefrompath(cgi.SCRIPT_NAME)#</cfoutput>" title="back to logs list" style="font-weight:bold;font-size:80%;text-decoration:none;color:#333;">&laquo;Back to logs list</a>&nbsp;&bull;&nbsp;<a href="#top" title="to top of page" style="font-weight:bold;font-size:80%;text-decoration:none;color:#333;">^ top</a></td>
	</tr>
	</table>
<!---  --->
<cfelse>
	<cfif NOT structkeyexists(session, 'logparser')>
		<cfset session.logparser = {}>
	<cfelse>
		<cfset structclear(session.logparser)>
	</cfif>
	<cfif NOT directoryexists(templogsdir)>
		<cfdirectory action="create" directory="#templogsdir#">
		<cfset strCommand = "del " & templogsdir & "\*.txt">
		<cffile action="write" file="#templogsdir#\deletetemplogs.bat" output="#strCommand#">
	<cfelse>
		<cfexecute name="#templogsdir#\deletetemplogs.bat" timeout="30"></cfexecute>
	</cfif>
	<!---  --->
	<cfdirectory action="list" directory="#logsdir#" recurse="no" filter="*.log" name="qLogsDir" sort="datelastmodified DESC, name ASC">
	<table width="80%" border="0" cellpadding="2" cellspacing="1" align="center">
	<tr style="background:#6cf">
		<th align="left">Name</th>
		<th width="150" align="right">Date</th>
		<th width="120" align="right">Size</th>
		<th width="60"></th>
	</tr>
	<cfoutput query="qLogsDir">
		<cfif qLogsDir.currentrow mod 2 is 0>
			<cfset bgc = "##f0f0f0">
		<cfelse>
			<cfset bgc = "##fff">
		</cfif>
	<tr style="background:#bgc#;">
		<td>#left(name, len(name)-4)#</td>
		<td align="right">#dateformat(datelastmodified, "dd mmm yy")# #timeformat(datelastmodified, "short")#</td>
		<td align="right">#numberformat(size, ",^")#</td>
		<td align="center"><a href="?logfile=#name#" style="text-decoration:none;" title="view log">view log</a></td>
	</tr>
	</cfoutput>
	<tr><td colspan="4" align="right" style="border-top:1px solid silver;padding-top:4px;padding-right:10px;"><a href="#top" title="to top of page" style="font-weight:bold;font-size:80%;text-decoration:none;color:#333;">top</a></td></tr>
	</table>
</cfif>
</cfprocessingdirective>

Open in new window

0
 
azadisaryevCommented:
oh, forgot to mention that the code is written in CF8...
if you are on an earlier version, then just replace all instances of {} with structnew()...
0
 
JanrowAuthor Commented:
Looks like a great effort. Wish I could see it. Not sure how and where to turn on SESSION MANAGEMENT in CF Admin, or if it's on now or not.
When I add sessionmanagement to Yes in application.cfm as in example code, I do see the following line:
 application 14 Nov 08 7:26 AM 7,242 view log exception 14 Nov 08 6:25 AM 68,182 view log UserError 14 Nov 08 3:23 AM 783 view log
When clicking on one of the view log links, I get this error:
"Incorrect number of columns in row. "
I think your reader code may be far above me.

<CFSETTING ENABLECFOUTPUTONLY="Yes">
<cfapplication name="Library"
  clientManagement="Yes"
  sessionmanagement="Yes"
  clientStorage="CUSTOMER"
  setClientCookies="Yes"
  setDomainCookies="Yes"> 

Open in new window

0
 
azadisaryevCommented:
which version of CF are you on?
which of the 3 logs you see in the logs list throws that error? the UserError log?
how are you adding entries to this log? using <cflog> or <cffile>? can you post a sample line from a log that throws that error?

0
 
azadisaryevCommented:
oops, my bad - completely forgot that the exception.log has a totally different structure from other logs!
i did not test my code with that log as it is very large on my comp and i wanted to avoid parsing it - my mistake!

let me re-write my code to account for exception log format. back soon with updated code...
0
 
azadisaryevCommented:
here's the edited code which now correctly parses exception.log file.

enjoy ;)
<cfprocessingdirective suppresswhitespace="yes">
<a name="top"></a>
<cfset logsdir = server.coldfusion.rootdir & "/logs/">
<cfset templogsdir = GetDirectoryFromPath(GetTemplatePath()) & "customlogparser_tempdir">
<!---  --->
<cfparam name="url.logfile" default="">
<cfparam name="url.sr" default="1">
<cfparam name="url.rows" default="5">
<cfset defaultColList = "severity,threadid,log_date,log_time,log_app,message">
<!---  --->
<cfif url.logfile neq "">
	<cfif NOT structkeyexists(session, 'logparser')><cfset session.logparser = {}></cfif>
	<cfset logname = rereplace(left(url.logfile, len(url.logfile)-4), "[^[:alnum:]]", "_", "ALL")>
	<cfset newname = left(url.logfile, len(url.logfile)-4) & ".txt">
	<cfif fileexists(logsdir & url.logfile)>
		<cfif NOT fileexists(templogsdir & "\" & newname)>
			<cffile action="copy" source="#logsdir & url.logfile#" destination="#templogsdir#\#newname#">
		</cfif>
		<cfif NOT structkeyexists(session.logparser, logname)>
			<cfif url.logfile eq 'exception.log'>
				<cfsetting requesttimeout="120">
				<cfset curLineCounter = 0>
				<cfset tempq = querynew("#defaultColList#,log_datetime,stacktrace")>
				<cfloop file="#templogsdir#\#newname#" index="curLine">
					<cfif left(curLine, 1) is '"'>
						<cfset curLineCounter = curLineCounter+1>
							<cfset queryaddrow(tempq)>
							<cfset curLine = replace(curLine, ',,', ', ,', 'all')>
							<cfloop from="1" to="#listlen(defaultColList)#" index="idx">
								<cfset querysetcell(tempq, listgetat(defaultColList, idx), replace(listgetat(curLine, idx), '"', '', 'all'))>
							</cfloop>
							<cfset querysetcell(tempq, 'log_datetime', tempq.log_date[curLineCounter] & ' ' & tempq.log_time[curLineCounter])>
					<cfelse>
						<cfset querysetcell(tempq, 'stacktrace', tempq.stacktrace[curLineCounter] & '<br />' & trim(curLine))>
					</cfif>
				</cfloop>
				<cfquery name="session.logparser.#logname#" dbtype="query">
				SELECT #defaultColList#,log_datetime,stacktrace
				FROM tempq 
				ORDER BY log_datetime DESC
				</cfquery>
			<cfelse>
				<cfhttp url="http://#cgi.HTTP_HOST & removechars(getdirectoryfrompath(cgi.SCRIPT_NAME), 1, 1)#/customlogparser_tempdir/#newname#" name="tempq" method="get" getasbinary="no" columns="#defaultColList#"></cfhttp>
				<cfquery name="session.logparser.#logname#" dbtype="query">
				SELECT #defaultColList#,(log_date + ' ' + log_time) AS log_datetime,'' AS stacktrace
				FROM tempq 
				ORDER BY log_datetime DESC
				</cfquery>
			</cfif>
		</cfif>
	<cfelse>
		<cfoutput>
			<h3>Can't find requested log file...</h3>
			<a href="#cgi.SCRIPT_NAME#" title="back to logs list" style="text-decoration:none;color:##333;font-weight:bold;">&laquo;Back to Logs list</a>
		</cfoutput>
		<cfabort>
	</cfif>
	<!---  --->
	<cfparam name="maxlogrows" default="#url.rows#">
	<cfset myQ = session.logparser['#logname#']>
	<cfset ttlrows = myQ.recordcount>
	<cfset modrows = ttlrows mod maxlogrows>
	<table width="80%" border="0" cellpadding="2" cellpadding="1" align="center">
	<!--- table header --->
	<tr><td colspan="5" align="left" style="padding-bottom:8px;"><a href="<cfoutput>#getfilefrompath(cgi.SCRIPT_NAME)#</cfoutput>" title"back to logs list" style="font-weight:bold;font-size:90%;text-decoration:none;color:#333;">&laquo;Back to logs list</a></td></tr>
	<tr><td colspan="5" align="center" valign="middle" style="padding:8px 0;background:#333;color:#fff;font-size:90%;">
	<cfoutput>
	Log File: <strong>#url.logfile#</strong> &nbsp;&bull;&nbsp; Rows: <strong>#url.sr# - #min(ttlrows, url.sr+maxlogrows-1)# of #ttlrows#</strong> &nbsp;&bull;&nbsp; Show 
	<select name="showrows" id="showrows" size="1" style="font-weight:normal;border:1px solid black;" onchange="window.location.href='#getfilefrompath(cgi.SCRIPT_NAME)#?logfile=#url.logfile#&sr=1&rows='+this.value;">
	<option value="5" <cfif maxlogrows eq 5>selected="selected"</cfif>>5</option>
	<cfloop from="10" to="50" step="10" index="numrows">
	<option value="#numrows#" <cfif numrows eq maxlogrows>selected="selected"</cfif>>#numrows#</option>
	</cfloop>
	</select> rows / page
	</cfoutput>
	</td></tr>
	<!--- top navigation --->
	<tr>
		<td colspan="5" align="center" style="border-top:1px solid silver;border-bottom:1px solid silver;font-size:90%;">
		<cfoutput>
		<cfif url.sr gt 1>
		<a href="?logfile=#url.logfile#&sr=1&rows=#maxlogrows#" title="jump to first entry" style="text-decoration:none;color:##69f;">&laquo;&laquo;first</a>
		&nbsp;&nbsp;
		<a href="?logfile=#url.logfile#&sr=#max(1, url.sr-maxlogrows)#&rows=#maxlogrows#" title="previous #maxlogrows# entries" style="text-decoration:none;color:##69f;">&laquo;&ndash;#maxlogrows#</a> 
		<cfelse>
		<span style="color:##ccc;">&laquo;&laquo;first&nbsp;&nbsp;&laquo;&ndash;#maxlogrows#</span>
		</cfif>
		&nbsp;&bull;&nbsp; 
		<cfif url.sr+maxlogrows gt ttlrows>
		<span style="color:##ccc;">+#maxlogrows#&raquo;&nbsp;&nbsp;last&raquo;&raquo;</span>
		<cfelse>
		<a href="?logfile=#url.logfile#&sr=#min(ttlrows, url.sr+maxlogrows)#&rows=#maxlogrows#" title="next #maxlogrows# entries" style="text-decoration:none;color:##69f;">+#maxlogrows#&raquo;</a>
		&nbsp;&nbsp;
		<a href="?logfile=#url.logfile#&sr=#(fix(ttlrows/maxlogrows)*maxlogrows)+1#&rows=#maxlogrows#" title="jump to last entry" style="text-decoration:none;color:##69f;">last&raquo;&raquo;</a>
		</cfif>
		</cfoutput>
		</td>
	</tr>
	<!--- log header --->
	<tr style="background:#6cf;font-size:90%;">
		<th align="left" width="20%">Date</th>
		<th align="left" width="20%">Time</th>
		<th align="left" width="20%">Severity</th>
		<th align="left" width="20%">ThreadID</th>
		<th align="left" width="20%">Aplication Name</th>
	</tr>
	<!--- log data --->
	<cfoutput query="session.logparser.#logname#" startrow="#url.sr#" maxrows="#maxlogrows#">
	<tr style="background:##e4e4e4;font-size:80%;">
		<td><strong>#dateformat(log_date, "dd mmm yyyy")#</strong></td>
		<td><strong>#timeformat(log_time, "hh:mm:ss TT")#</strong></td>
		<td><strong>#severity#</strong></td>
		<td><strong>#threadid#</strong></td>
		<td><strong>#log_app#</strong></td>
	</tr>
	<tr><td colspan="5" align="left" style="padding-top:4px;font-size:80%;">#rereplace(message, chr(60)&'('&chr(97)&'|'&chr(65)&') ', '&lt;\1 ', 'all')#</td></tr>
	<cfif len(trim(stacktrace))>
		<tr><td colspan="5" style="padding:4px 2px;font-size:80%;"><em style="font-weight:bold;">Stack Trace:</em></td></tr>
		<tr><td colspan="5" style="padding:8px 12px;font-size:80%;background:##f8f8f8;">#replace(stacktrace, '<br />', '')#</td></tr>
	</cfif>
	</cfoutput>
	<!--- bottom navigation --->
	<tr>
		<td colspan="5" align="center" style="border-top:1px solid silver;font-size:90%;">
		<cfoutput>
		<cfif url.sr gt 1>
		<a href="?logfile=#url.logfile#&sr=1&rows=#maxlogrows#" title="jump to first entry" style="text-decoration:none;color:##69f;">&laquo;&laquo;first</a>
		&nbsp;&nbsp;
		<a href="?logfile=#url.logfile#&sr=#max(1, url.sr-maxlogrows)#&rows=#maxlogrows#" title="previous #maxlogrows# entries" style="text-decoration:none;color:##69f;">&laquo;&ndash;#maxlogrows#</a> 
		<cfelse>
		<span style="color:##ccc;">&laquo;&laquo;first&nbsp;&nbsp;&laquo;&ndash;#maxlogrows#</span>
		</cfif>
		&nbsp;&bull;&nbsp; 
		<cfif url.sr+maxlogrows gt ttlrows>
		<span style="color:##ccc;">+#maxlogrows#&raquo;&nbsp;&nbsp;last&raquo;&raquo;</span>
		<cfelse>
		<a href="?logfile=#url.logfile#&sr=#min(ttlrows, url.sr+maxlogrows)#&rows=#maxlogrows#" title="next #maxlogrows# entries" style="text-decoration:none;color:##69f;">+#maxlogrows#&raquo;</a>
		&nbsp;&nbsp;
		<a href="?logfile=#url.logfile#&sr=#(fix(ttlrows/maxlogrows)*maxlogrows)+1#&rows=#maxlogrows#" title="jump to last entry" style="text-decoration:none;color:##69f;">last&raquo;&raquo;</a>
		</cfif>
		</cfoutput>
		</td>
	</tr>
	<!--- footer --->
	<tr>
		<td colspan="5" align="right" style="border-top:1px solid silver;padding-top:4px;padding-right:10px;"><a href="<cfoutput>#getfilefrompath(cgi.SCRIPT_NAME)#</cfoutput>" title="back to logs list" style="font-weight:bold;font-size:80%;text-decoration:none;color:#333;">&laquo;Back to logs list</a>&nbsp;&bull;&nbsp;<a href="#top" title="to top of page" style="font-weight:bold;font-size:80%;text-decoration:none;color:#333;">^ top</a></td>
	</tr>
	</table>
<cfelse>
	<cfif NOT structkeyexists(session, 'logparser')>
		<cfset session.logparser = {}>
	<cfelse>
		<cfset structclear(session.logparser)>
	</cfif>
	<cfif NOT directoryexists(templogsdir)>
		<cfdirectory action="create" directory="#templogsdir#">
		<cfset strCommand = "del " & templogsdir & "\*.txt">
		<cffile action="write" file="#templogsdir#\deletetemplogs.bat" output="#strCommand#">
	<cfelse>
		<cfexecute name="#templogsdir#\deletetemplogs.bat" timeout="30"></cfexecute>
	</cfif>
	<cfdirectory action="list" directory="#logsdir#" recurse="no" filter="*.log" name="qLogsDir" sort="datelastmodified DESC, name ASC">
	<table width="80%" border="0" cellpadding="2" cellspacing="1" align="center">
	<tr style="background:#6cf">
		<th align="left">Name</th>
		<th width="150" align="right">Date</th>
		<th width="120" align="right">Size</th>
		<th width="60"></th>
	</tr>
	<cfoutput query="qLogsDir">
		<cfif qLogsDir.currentrow mod 2 is 0>
			<cfset bgc = "##f0f0f0">
		<cfelse>
			<cfset bgc = "##fff">
		</cfif>
	<tr style="background:#bgc#;">
		<td>#left(name, len(name)-4)#</td>
		<td align="right">#dateformat(datelastmodified, "dd mmm yy")# #timeformat(datelastmodified, "short")#</td>
		<td align="right">#numberformat(size, ",^")#</td>
		<td align="center"><a href="?logfile=#name#" style="text-decoration:none;" title="view log">view log</a></td>
	</tr>
	</cfoutput>
	<tr><td colspan="4" align="right" style="border-top:1px solid silver;padding-top:4px;padding-right:10px;"><a href="#top" title="to top of page" style="font-weight:bold;font-size:80%;text-decoration:none;color:#333;">top</a></td></tr>
	</table>
</cfif>
</cfprocessingdirective>

Open in new window

0
 
JanrowAuthor Commented:

I made sure I'm using your latest code but still get the error shown in my attached snippet.
> which version of CF are you on?
CF8 standard.
> which of the 3 logs you see in the logs list throws that error?
Exception.log and Application.log as found in CF Admin logs.
> how are you adding entries to this log?
For the time being ,for testing, I removed the Site-wide Error Handler from CF Admin so it is the default. I'm not using cflog or cffile for logs.
> can you post a sample line from a log that throws that error?
Yes. Below.
 

Incorrect number of columns in row. Verify the number of columns specified in the columns attribute and in the target file   The error occurred in C:\SERVER\DEFAULT\log_reader.cfm: line 46
44 : </cfquery> 45 : <cfelse> 46 : <cfhttp url="http://#cgi.HTTP_HOST & removechars(getdirectoryfrompath(cgi.SCRIPT_NAME), 1, 1)#/customlogparser_tempdir/#newname#" name="tempq" method="get" getasbinary="no" columns="#defaultColList#"></cfhttp> 47 : <cfquery name="session.logparser.#logname#" dbtype="query"> 48 : SELECT #defaultColList#,(log_date + ' ' + log_time) AS log_datetime,'' AS stacktrace  

Open in new window

0
 
azadisaryevCommented:
hmm... strange.... i am on cf8 standard, too, and it works just fine...

could you post a sample of your exception.log file? maybe it records exceptions differently than mine does... maybe because i am using j2ee sessions and you are not... hard to guess without seeing the log entries...

just 2 entries from exception.log with the stack trace will be enough, i think: just copy and paste into here...

thanks!
0
 
JanrowAuthor Commented:
Sure thing. Here's the exception log. I first cleared it, then clicked on one of the log links and got the error and posted it in the code snippet.  I hope this helps.
Searching file(s): exception.log  1 - 35 of 35  
1  "Error","jrpp-1994","11/16/08","21:35:15","Website","Incorrect number of columns in row.Verify the number of columns specified in the columns attribute and in the target file The specific sequence of files included or processed is: C:\SERVER\DEFAULT\log_reader.cfm, line: 46 "  
2  coldfusion.tagext.net.HttpTag$InvalidColumnsException: Incorrect number of columns in row.  
3  at coldfusion.tagext.net.HttpTag.connHelper(HttpTag.java:996)  
4  at coldfusion.tagext.net.HttpTag.doEndTag(HttpTag.java:1062)  
5  at cflog_reader2ecfm973891935.runPage(C:\SERVER\DEFAULT\log_reader.cfm:46)  
6  at coldfusion.runtime.CfJspPage.invoke(CfJspPage.java:196)  
7  at coldfusion.tagext.lang.IncludeTag.doStartTag(IncludeTag.java:370)  
8  at coldfusion.filter.CfincludeFilter.invoke(CfincludeFilter.java:65)  
9  at coldfusion.filter.ApplicationFilter.invoke(ApplicationFilter.java:279)  
10  at coldfusion.filter.RequestMonitorFilter.invoke(RequestMonitorFilter.java:48)  
11  at coldfusion.filter.MonitoringFilter.invoke(MonitoringFilter.java:40)  
12  at coldfusion.filter.PathFilter.invoke(PathFilter.java:86)  
13  at coldfusion.filter.ExceptionFilter.invoke(ExceptionFilter.java:70)  
14  at coldfusion.filter.BrowserDebugFilter.invoke(BrowserDebugFilter.java:74)  
15  at coldfusion.filter.ClientScopePersistenceFilter.invoke(ClientScopePersistenceFilter.java:28)  
16  at coldfusion.filter.BrowserFilter.invoke(BrowserFilter.java:38)  
17  at coldfusion.filter.NoCacheFilter.invoke(NoCacheFilter.java:46)  
18  at coldfusion.filter.GlobalsFilter.invoke(GlobalsFilter.java:38)  
19  at coldfusion.filter.DatasourceFilter.invoke(DatasourceFilter.java:22)  
20  at coldfusion.CfmServlet.service(CfmServlet.java:175)  
21  at coldfusion.bootstrap.BootstrapServlet.service(BootstrapServlet.java:89)  
22  at jrun.servlet.FilterChain.doFilter(FilterChain.java:86)  
23  at coldfusion.monitor.event.MonitoringServletFilter.doFilter(MonitoringServletFilter.java:42)  
24  at coldfusion.bootstrap.BootstrapFilter.doFilter(BootstrapFilter.java:46)  
25  at jrun.servlet.FilterChain.doFilter(FilterChain.java:94)  
26  at jrun.servlet.FilterChain.service(FilterChain.java:101)  
27  at jrun.servlet.ServletInvoker.invoke(ServletInvoker.java:106)  
28  at jrun.servlet.JRunInvokerChain.invokeNext(JRunInvokerChain.java:42)  
29  at jrun.servlet.JRunRequestDispatcher.invoke(JRunRequestDispatcher.java:286)  
30  at jrun.servlet.ServletEngineService.dispatch(ServletEngineService.java:543)  
31  at jrun.servlet.jrpp.JRunProxyService.invokeRunnable(JRunProxyService.java:203)  
32  at jrunx.scheduler.ThreadPool$DownstreamMetrics.invokeRunnable(ThreadPool.java:320)  
33  at jrunx.scheduler.ThreadPool$ThreadThrottle.invokeRunnable(ThreadPool.java:428)  
34  at jrunx.scheduler.ThreadPool$UpstreamMetrics.invokeRunnable(ThreadPool.java:266)  
35  at jrunx.scheduler.WorkerThread.run(WorkerThread.java:66)  

Open in new window

0
 
black0psCommented:
gonna have to earn those points... i need to remove myself from this thread.
0
 
azadisaryevCommented:
@Janrow:

i am stumped more and more by this not working for you...
i have now tested it wth each and every log on all my servers, and it works just fine!

i am attaching the most recent version of the code, in which i have added a few things, mainly to accommodate possible case-sensitivity in log names... see if it works now.

[NOTE: with the latest changes, instead of showing that error it may report that the log file is empty instead - if you see that, and you know that the log is not empty, then it means it still does not work...]

can you email me the log that throws (or used to throw) that error about incorrect column numbers? my email is azadi AT sabai-dee DOT com (yes, that's a dash in there).  thanks - i really want to make it work for any standard cf log...

<cfprocessingdirective suppresswhitespace="yes">
<a name="top"></a>
<cfset logsdir = server.coldfusion.rootdir & "/logs/">
<cfset templogsdir = GetDirectoryFromPath(GetTemplatePath()) & "customlogparser_tempdir">
<!---  --->
<cfparam name="url.logfile" default="">
<cfparam name="url.sr" default="1">
<cfparam name="url.rows" default="5">
<cfset defaultColList = "severity,threadid,log_d,log_t,log_app,message">
<!---  --->
<cfif url.logfile neq "">
	<cfif NOT structkeyexists(session, 'logparser')><cfset session.logparser = {}></cfif>
	<cfset logname = rereplace(left(url.logfile, len(url.logfile)-4), "[^[:alnum:]]", "_", "ALL")>
	<cfset newname = left(url.logfile, len(url.logfile)-4) & ".txt">
	<cfif fileexists(logsdir & url.logfile)>
		<cfif NOT fileexists(templogsdir & "\" & newname)>
			<cffile action="copy" source="#logsdir & url.logfile#" destination="#templogsdir#\#newname#">
		</cfif>
		<cfif NOT structkeyexists(session.logparser, logname)>
			<cfif comparenocase(url.logfile, 'exception.log') is 0>
				<cfsetting requesttimeout="120">
				<cfset tempq = querynew("#defaultColList#,log_dt,stacktrace")>
				<cfset curLineCounter = 0>
				<cfloop file="#templogsdir#\#newname#" index="curLine">
					<cfif left(curLine, 1) is '"'>
						<cfset curLineCounter = curLineCounter+1>
							<cfset queryaddrow(tempq)>
							<cfset curLine = replace(curLine, ',,', ', ,', 'all')>
							<cfloop from="1" to="#listlen(defaultColList)#" index="idx">
								<cfset querysetcell(tempq, listgetat(defaultColList, idx), replace(listgetat(curLine, idx), '"', '', 'all'))>
							</cfloop>
							<cfset querysetcell(tempq, 'log_dt', tempq.log_d[curLineCounter] & ' ' & tempq.log_t[curLineCounter])>
					<cfelse>
						<cfset querysetcell(tempq, 'stacktrace', tempq.stacktrace[curLineCounter] & '<br />' & trim(curLine))>
					</cfif>
				</cfloop>
				<cfquery name="session.logparser.#logname#" dbtype="query">
				SELECT #defaultColList#,log_dt,stacktrace
				FROM tempq 
				ORDER BY log_dt DESC
				</cfquery>
			<cfelse>
				<cftry>
					<cfhttp url="http://#cgi.HTTP_HOST & getdirectoryfrompath(cgi.SCRIPT_NAME)#/customlogparser_tempdir/#newname#" name="tempq" method="get" getasbinary="no" columns="#defaultColList#"></cfhttp>
					<cfcatch><cfif cfcatch.Type eq "java.util.NoSuchElementException"><cfset tempq = querynew("#defaultColList#")></cfif></cfcatch>
				</cftry>
				<cfif NOT isdefined("tempq")>
					<cfset tempq = querynew("#defaultColList#")>
				</cfif>
				<cfquery name="session.logparser.#logname#" dbtype="query">
				SELECT #defaultColList#, (log_d || log_t) AS log_dt, '' AS stacktrace
				FROM tempq 
				ORDER BY log_dt DESC
				</cfquery>
			</cfif>
		</cfif>
	<cfelse>
		<cfoutput>
			<h3>Can't find requested log file...</h3>
			<a href="#cgi.SCRIPT_NAME#" title="back to logs list" style="text-decoration:none;color:##333;font-weight:bold;">&laquo;Back to Logs list</a>
		</cfoutput>
		<cfabort>
	</cfif>
	<!---  --->
	<cfparam name="maxlogrows" default="#url.rows#">
	<cfset myQ = session.logparser['#logname#']>
	<cfset ttlrows = myQ.recordcount>
	<cfset modrows = ttlrows mod maxlogrows>
	<table width="80%" border="0" cellpadding="2" cellpadding="1" align="center">
	<!--- table header --->
	<tr><td colspan="5" align="left" style="padding-bottom:8px;"><a href="<cfoutput>#getfilefrompath(cgi.SCRIPT_NAME)#</cfoutput>" title"back to logs list" style="font-weight:bold;font-size:90%;text-decoration:none;color:#333;">&laquo;Back to logs list</a></td></tr>
	<tr><td colspan="5" align="center" valign="middle" style="padding:8px 0;background:#333;color:#fff;font-size:90%;">
	<cfoutput>
	Log File: <strong>#url.logfile#</strong> &nbsp;&bull;&nbsp; Rows: <strong>#url.sr# - #min(ttlrows, url.sr+maxlogrows-1)# of #ttlrows#</strong> &nbsp;&bull;&nbsp; Show 
	<select name="showrows" id="showrows" size="1" style="font-weight:normal;border:1px solid black;" onchange="window.location.href='#getfilefrompath(cgi.SCRIPT_NAME)#?logfile=#url.logfile#&sr=1&rows='+this.value;">
	<option value="5" <cfif maxlogrows eq 5>selected="selected"</cfif>>5</option>
	<cfloop from="10" to="50" step="10" index="numrows">
	<option value="#numrows#" <cfif numrows eq maxlogrows>selected="selected"</cfif>>#numrows#</option>
	</cfloop>
	</select> rows / page
	</cfoutput>
	</td></tr>
	<!--- top navigation --->
	<tr>
		<td colspan="5" align="center" style="border-top:1px solid silver;border-bottom:1px solid silver;font-size:90%;">
		<cfoutput>
		<cfif url.sr gt 1>
		<a href="?logfile=#url.logfile#&sr=1&rows=#maxlogrows#" title="jump to first entry" style="text-decoration:none;color:##69f;">&laquo;&laquo;first</a>
		&nbsp;&nbsp;
		<a href="?logfile=#url.logfile#&sr=#max(1, url.sr-maxlogrows)#&rows=#maxlogrows#" title="previous #maxlogrows# entries" style="text-decoration:none;color:##69f;">&laquo;&ndash;#maxlogrows#</a> 
		<cfelse>
		<span style="color:##ccc;">&laquo;&laquo;first&nbsp;&nbsp;&laquo;&ndash;#maxlogrows#</span>
		</cfif>
		&nbsp;&bull;&nbsp; 
		<cfif url.sr+maxlogrows gt ttlrows>
		<span style="color:##ccc;">+#maxlogrows#&raquo;&nbsp;&nbsp;last&raquo;&raquo;</span>
		<cfelse>
		<a href="?logfile=#url.logfile#&sr=#min(ttlrows, url.sr+maxlogrows)#&rows=#maxlogrows#" title="next #maxlogrows# entries" style="text-decoration:none;color:##69f;">+#maxlogrows#&raquo;</a>
		&nbsp;&nbsp;
		<a href="?logfile=#url.logfile#&sr=#(fix(ttlrows/maxlogrows)*maxlogrows)+1#&rows=#maxlogrows#" title="jump to last entry" style="text-decoration:none;color:##69f;">last&raquo;&raquo;</a>
		</cfif>
		</cfoutput>
		</td>
	</tr>
	<!--- log header --->
	<tr style="background:#6cf;font-size:90%;">
		<th align="left" width="20%">Date</th>
		<th align="left" width="20%">Time</th>
		<th align="left" width="20%">Severity</th>
		<th align="left" width="20%">ThreadID</th>
		<th align="left" width="20%">Aplication Name</th>
	</tr>
	<!--- log data --->
	<cfoutput query="session.logparser.#logname#" startrow="#url.sr#" maxrows="#maxlogrows#">
	<tr style="background:##e4e4e4;font-size:80%;">
		<td><strong>#dateformat(log_d, "dd mmm yyyy")#</strong></td>
		<td><strong>#timeformat(log_t, "hh:mm:ss TT")#</strong></td>
		<td><strong>#severity#</strong></td>
		<td><strong>#threadid#</strong></td>
		<td><strong>#log_app#</strong></td>
	</tr>
	<tr><td colspan="5" align="left" style="padding-top:4px;font-size:80%;">#rereplace(message, chr(60)&'('&chr(97)&'|'&chr(65)&') ', '&lt;\1 ', 'all')#</td></tr>
	<cfif len(trim(stacktrace))>
		<tr><td colspan="5" style="padding:4px 2px;font-size:80%;"><em style="font-weight:bold;">Stack Trace:</em></td></tr>
		<tr><td colspan="5" style="padding:8px 12px;font-size:80%;background:##f8f8f8;">#replace(stacktrace, '<br />', '')#</td></tr>
	</cfif>
	</cfoutput>
	<cfif session.logparser['#logname#'].recordcount is 0>
	<tr><td colspan="5" align="center" style="padding:12px 0;">The <cfoutput>#url.logfile#</cfoutput> log is empty...</td></tr>
	</cfif>
	<!--- bottom navigation --->
	<tr>
		<td colspan="5" align="center" style="border-top:1px solid silver;font-size:90%;">
		<cfoutput>
		<cfif url.sr gt 1>
		<a href="?logfile=#url.logfile#&sr=1&rows=#maxlogrows#" title="jump to first entry" style="text-decoration:none;color:##69f;">&laquo;&laquo;first</a>
		&nbsp;&nbsp;
		<a href="?logfile=#url.logfile#&sr=#max(1, url.sr-maxlogrows)#&rows=#maxlogrows#" title="previous #maxlogrows# entries" style="text-decoration:none;color:##69f;">&laquo;&ndash;#maxlogrows#</a> 
		<cfelse>
		<span style="color:##ccc;">&laquo;&laquo;first&nbsp;&nbsp;&laquo;&ndash;#maxlogrows#</span>
		</cfif>
		&nbsp;&bull;&nbsp; 
		<cfif url.sr+maxlogrows gt ttlrows>
		<span style="color:##ccc;">+#maxlogrows#&raquo;&nbsp;&nbsp;last&raquo;&raquo;</span>
		<cfelse>
		<a href="?logfile=#url.logfile#&sr=#min(ttlrows, url.sr+maxlogrows)#&rows=#maxlogrows#" title="next #maxlogrows# entries" style="text-decoration:none;color:##69f;">+#maxlogrows#&raquo;</a>
		&nbsp;&nbsp;
		<a href="?logfile=#url.logfile#&sr=#(fix(ttlrows/maxlogrows)*maxlogrows)+1#&rows=#maxlogrows#" title="jump to last entry" style="text-decoration:none;color:##69f;">last&raquo;&raquo;</a>
		</cfif>
		</cfoutput>
		</td>
	</tr>
	<!--- footer --->
	<tr>
		<td colspan="5" align="right" style="border-top:1px solid silver;padding-top:4px;padding-right:10px;"><a href="<cfoutput>#getfilefrompath(cgi.SCRIPT_NAME)#</cfoutput>" title="back to logs list" style="font-weight:bold;font-size:80%;text-decoration:none;color:#333;">&laquo;Back to logs list</a>&nbsp;&bull;&nbsp;<a href="#top" title="to top of page" style="font-weight:bold;font-size:80%;text-decoration:none;color:#333;">^ top</a></td>
	</tr>
	</table>
<cfelse>
	<cfif NOT structkeyexists(session, 'logparser')>
		<cfset session.logparser = {}>
	<cfelse>
		<cfset structclear(session.logparser)>
	</cfif>
	<cfif NOT directoryexists(templogsdir)>
		<cfdirectory action="create" directory="#templogsdir#">
		<cfset strCommand = "del " & templogsdir & "\*.txt">
		<cffile action="write" file="#templogsdir#\deletetemplogs.bat" output="#strCommand#">
	<cfelse>
		<cfexecute name="#templogsdir#\deletetemplogs.bat" timeout="30"></cfexecute>
	</cfif>
	<cfdirectory action="list" directory="#logsdir#" recurse="no" filter="*.log" name="qLogsDir" sort="datelastmodified DESC, name ASC">
	<table width="80%" border="0" cellpadding="2" cellspacing="1" align="center">
	<tr style="background:#6cf">
		<th align="left">Name</th>
		<th width="150" align="right">Date</th>
		<th width="120" align="right">Size</th>
		<th width="60"></th>
	</tr>
	<cfoutput query="qLogsDir">
		<cfif qLogsDir.currentrow mod 2 is 0>
			<cfset bgc = "##f0f0f0">
		<cfelse>
			<cfset bgc = "##fff">
		</cfif>
	<tr style="background:#bgc#;">
		<td>#left(name, len(name)-4)#</td>
		<td align="right">#dateformat(datelastmodified, "dd mmm yy")# #timeformat(datelastmodified, "short")#</td>
		<td align="right">#numberformat(size, ",^")#</td>
		<td align="center"><a href="?logfile=#name#" style="text-decoration:none;" title="view log">view log</a></td>
	</tr>
	</cfoutput>
	<tr><td colspan="4" align="right" style="border-top:1px solid silver;padding-top:4px;padding-right:10px;"><a href="#top" title="to top of page" style="font-weight:bold;font-size:80%;text-decoration:none;color:#333;">top</a></td></tr>
	</table>
</cfif>
</cfprocessingdirective>

Open in new window

0
 
azadisaryevCommented:
oh, bummer... are you trying to view the log file you created with the code you posted in your original post?
that won't work, sorry.
the log reader code expects the log format to follow standard CF log format. your code does not create a correct CF log - your code just create a file with some text in it.
you need to use <cflog> to create a valid cf log file, which will then easily be parsed by my log reader.
something like this:
<cflog file="my_html_error_log" type="error" text="<b>#USER#</b><br>#error.diagnostics#">

can you post the code you create your log entries with? i can help you edit it so that it creates a valid cf log that can be parsed with all your html formatting displayed for you...
0
 
azadisaryevCommented:
just fyi, here's an adobe technote about how to log errors using site-wide error handler:
http://www.adobe.com/go/tn_19198
0
 
azadisaryevCommented:
oh, and if you are trying to parse a log with entries created with the code from your original post, then no wonder that it throws the column number error:
you are using inebreaks (#chr(13)##chr(10)#) inside the error mesage, which will cause the log parser to treat that as end-of-line and expect the next line to be in correct log format, which it is not...

sorry, this will not work on any logs you have created that have plain-text line-breaks inside error message column...
0
 
azadisaryevCommented:
... but you can open that log in Notepad/other plain-text editor and remove any linebreaks inside error messages and save the file - after that the log parser should work on it...
0
 
azadisaryevCommented:
hmmm... disregard my 2 previous (stupid) posts - cf logger removes any plain-text line-breaks from log text... how silly of me to forget it, especially since i said that same thing before in this thread...

please do email me your log that causes the error - i am very curious about it now...
0
 
JanrowAuthor Commented:
This is getting a bit confusing. So, let me start agin from a known set of conditions:
 I followed the directions exactly as found on this page:
http://kb.adobe.com/selfservice/viewContent.do?externalId=tn_19198&sliceId=1
The produced error gave this exact error log. The only difference is that I change the domain name to "domain.com". Notice the <br> in the log report. That's one of the main reasons for this question.
Nov 17, 2008    11:42 AM    Error    jrpp-2256    WEBSITE    
Element BLAH is undefined in VARIABLES. <br>The error occurred on line 1., http://www.domain.com/make_error.cfm?make_error=YES, /make_error.cfmmake_error=YES  
 
I don't know the origin of the extra formatting, the <br>'s, etc. It may be some module on our site but I don't see it.
You say I should not use your log reader you wrote to read the logs. Yes, that's what I was using. You're assuming I know what you want me to use, if not the log reader. I've looked at all the links, read your posts many times, but it makes no sense to me. So, this is taking far too long for me, and I'm sure it's my fault so I need to end it.
Thanks for your help. I'll just live with it. And anyway, I'm sure others will take advantate of your Log Reader.
 
0

Featured Post

Free recovery tool for Microsoft Active Directory

Veeam Explorer for Microsoft Active Directory provides fast and reliable object-level recovery for Active Directory from a single-pass, agentless backup or storage snapshot — without the need to restore an entire virtual machine or use third-party tools.

  • 13
  • 6
  • 2
Tackle projects and never again get stuck behind a technical roadblock.
Join Now