1 34 35 package com.j2biz.blogunity.web.filter; 36 37 import java.io.File ; 38 import java.io.FileWriter ; 39 import java.io.IOException ; 40 import java.io.PrintWriter ; 41 import java.text.SimpleDateFormat ; 42 import java.util.Date ; 43 import java.util.TimeZone ; 44 45 import javax.servlet.Filter ; 46 import javax.servlet.FilterChain ; 47 import javax.servlet.FilterConfig ; 48 import javax.servlet.ServletException ; 49 import javax.servlet.ServletRequest ; 50 import javax.servlet.ServletResponse ; 51 import javax.servlet.http.HttpServletRequest ; 52 import javax.servlet.http.HttpServletResponse ; 53 import javax.servlet.http.HttpSession ; 54 55 import org.apache.commons.lang.StringUtils; 56 import org.apache.commons.logging.Log; 57 import org.apache.commons.logging.LogFactory; 58 59 import com.j2biz.blogunity.BlogunityManager; 60 import com.j2biz.blogunity.IConstants; 61 import com.j2biz.blogunity.dao.BlogDAO; 62 import com.j2biz.blogunity.dao.RefererDAO; 63 import com.j2biz.blogunity.dao.VisitedPageDAO; 64 import com.j2biz.blogunity.exception.BlogunityException; 65 import com.j2biz.blogunity.pojo.Blog; 66 import com.j2biz.blogunity.pojo.Referer; 67 import com.j2biz.blogunity.pojo.User; 68 import com.j2biz.blogunity.pojo.VisitedPage; 69 70 73 public class AccessLogFilter implements Filter { 74 77 private static final Log log = LogFactory.getLog(AccessLogFilter.class); 78 79 82 protected static final String months[] = {"Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", 83 "Aug", "Sep", "Oct", "Nov", "Dec"}; 84 85 private Date currentDate; 86 87 private String timeZone; 88 89 private SimpleDateFormat timeFormatter; 90 91 private SimpleDateFormat monthFormatter; 92 93 private SimpleDateFormat yearFormatter; 94 95 private SimpleDateFormat dayFormatter; 96 97 private PrintWriter writer = null; 98 99 private SimpleDateFormat dateFormatter; 100 101 private String dateStamp; 102 103 private String space = " "; 104 105 private boolean rotatable = true; 106 107 private String prefix = "access_"; 108 109 private String suffix = ".log"; 110 111 private long rotationLastChecked = 0L; 112 113 118 public void init(FilterConfig arg0) throws ServletException { 119 currentDate = new Date (); 120 121 TimeZone tz = TimeZone.getDefault(); 122 timeZone = calculateTimeZoneOffset(tz.getRawOffset()); 123 124 dateFormatter = new SimpleDateFormat ("yyyy-MM-dd"); 125 dateFormatter.setTimeZone(tz); 126 127 dateStamp = dateFormatter.format(currentDate); 128 129 dayFormatter = new SimpleDateFormat ("dd"); 130 dayFormatter.setTimeZone(tz); 131 monthFormatter = new SimpleDateFormat ("MM"); 132 monthFormatter.setTimeZone(tz); 133 yearFormatter = new SimpleDateFormat ("yyyy"); 134 yearFormatter.setTimeZone(tz); 135 136 timeFormatter = new SimpleDateFormat ("HH:mm:ss"); 137 timeFormatter.setTimeZone(tz); 138 139 currentDate = new Date (); 140 141 } 142 143 149 public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) 150 throws IOException , ServletException { 151 152 HttpServletRequest request = (HttpServletRequest ) req; 153 HttpServletResponse response = (HttpServletResponse ) res; 154 155 String requestUri = request.getRequestURI(); 157 requestUri = requestUri.substring(request.getContextPath().length() + 6, requestUri 158 .length()); 159 if (requestUri.length() == 0) { 160 requestUri = "/"; 161 } 162 int indx = requestUri.indexOf("/", 1); 163 if (indx == -1) { 164 indx = requestUri.length(); 165 } 166 167 String blogName = requestUri.substring(1, indx); 169 170 if (StringUtils.isEmpty(blogName)) { 171 chain.doFilter(req, res); 172 return; 173 } 174 175 File blogDataDir = new File (BlogunityManager.getSystemConfiguration().getBlogsDirectory(), 177 blogName); 178 if (!blogDataDir.exists()) { 179 chain.doFilter(req, res); 181 return; 182 } 183 184 try { 185 logToDatabase(request, response, blogName); 186 } catch (BlogunityException e) { 187 log.error("Unable to log access to database for blog '" + blogName + "'!"); 188 } 189 190 chain.doFilter(req, res); 191 192 if (BlogunityManager.getSystemConfiguration().isAccessLoggingEnabled()) { 193 logToFile(request, response, blogName); 194 } 195 196 } 197 198 205 private void logToDatabase(HttpServletRequest request, HttpServletResponse response, 206 String blogName) throws BlogunityException { 207 208 BlogDAO dao = new BlogDAO(); 209 Blog blog = dao.getBlogByUrlName(blogName); 210 211 String page = request.getRequestURL().toString(); 212 213 String referer = request.getHeader("referer"); 214 if (StringUtils.isEmpty(referer)) referer = null; 215 else { 216 if (page.startsWith(BlogunityManager.getBase())) { 219 String temp = StringUtils.substringAfter(page, BlogunityManager.getBase()); 220 if (temp.startsWith("/my") || temp.startsWith("/exec") 221 || temp.startsWith("/blogs/" + blogName)) { 222 referer = null; 223 } 224 } 225 226 } 227 228 String host = null; 229 230 if (isResolveHosts()) host = request.getRemoteHost(); 231 else 232 host = request.getRemoteAddr(); 233 234 Date d = new Date (); 235 236 if (request.getQueryString() != null) { 237 page += "?" + request.getQueryString(); 238 } 239 240 Referer refObj = new Referer(blog, referer, host, d); 241 VisitedPage pageObj = new VisitedPage(blog, page, host, d); 242 243 (new RefererDAO()).createReferer(refObj); 244 (new VisitedPageDAO()).createVisitedPage(pageObj); 245 246 } 247 248 254 private void logToFile(HttpServletRequest request, HttpServletResponse response, String blogName) 255 throws IOException , ServletException { 256 257 File blogDataDir = new File (BlogunityManager.getSystemConfiguration().getBlogsDirectory(), 259 blogName); 260 261 if (!blogDataDir.exists()) { return; } 262 263 File logsDir = new File (blogDataDir, "logs"); 264 if (!logsDir.exists()) { 266 try { 267 boolean result = logsDir.mkdir(); 268 if (!result) { 269 log.error("Unable to create 'logs'-directory for blog '" + blogName + "'!"); 270 return; 271 } 272 } catch (Throwable t) { 273 log.error("Unable to create 'logs'-directory for blog '" + blogName + "'!", t); 274 return; 275 } 276 } 277 278 open(logsDir); 279 log(getLogMessage(request, response), logsDir); 280 close(); 281 282 } 283 284 private String calculateTimeZoneOffset(long offset) { 285 StringBuffer tz = new StringBuffer (); 286 if ((offset < 0)) { 287 tz.append("-"); 288 offset = -offset; 289 } else { 290 tz.append("+"); 291 } 292 293 long hourOffset = offset / (1000 * 60 * 60); 294 long minuteOffset = (offset / (1000 * 60)) % 60; 295 296 if (hourOffset < 10) tz.append("0"); 297 tz.append(hourOffset); 298 299 if (minuteOffset < 10) tz.append("0"); 300 tz.append(minuteOffset); 301 302 return tz.toString(); 303 } 304 305 private boolean isResolveHosts() { 306 return true; 307 } 308 309 316 private String lookup(String month) { 317 318 int index; 319 try { 320 index = Integer.parseInt(month) - 1; 321 } catch (Throwable t) { 322 index = 0; } 324 return (months[index]); 325 326 } 327 328 private String getLogMessage(HttpServletRequest request, HttpServletResponse response) { 329 330 Date date = getDate(); 331 StringBuffer result = new StringBuffer (); 332 333 String value = null; 334 335 if (isResolveHosts()) result.append(request.getRemoteHost()); 336 else 337 result.append(request.getRemoteAddr()); 338 339 result.append(" - "); 340 341 value = null; 342 343 HttpSession s = request.getSession(false); 345 if (s != null) { 346 User u = (User) s.getAttribute(IConstants.Session.USER); 347 if (u != null) value = u.getNickname(); 348 } 349 350 if (value == null) value = "guest"; 351 352 result.append(value); 353 result.append(space); 354 355 result.append("["); 356 result.append(dayFormatter.format(date)); result.append('/'); 358 result.append(lookup(monthFormatter.format(date))); result.append('/'); 360 result.append(yearFormatter.format(date)); result.append(':'); 362 result.append(timeFormatter.format(date)); result.append(space); 364 result.append(timeZone); result.append("] \""); 366 367 result.append(request.getMethod()); 368 result.append(space); 369 result.append(request.getRequestURI()); 370 if (request.getQueryString() != null) { 371 result.append('?'); 372 result.append(request.getQueryString()); 373 } 374 result.append(space); 375 result.append(request.getProtocol()); 376 result.append("\" "); 377 378 result.append(HttpServletResponse.SC_OK); 380 381 result.append(space); 382 383 int length = response.getBufferSize(); 385 386 if (length <= 0) value = "-"; 387 else 388 value = "" + length; 389 result.append(value); 390 391 result.append(space); 392 result.append("\""); 393 String referer = request.getHeader("referer"); 394 if (referer != null) result.append(referer); 395 else 396 result.append("-"); 397 result.append("\""); 398 399 result.append(space); 400 result.append("\""); 401 String ua = request.getHeader("user-agent"); 402 if (ua != null) result.append(ua); 403 else 404 result.append("-"); 405 result.append("\""); 406 407 return result.toString(); 408 409 } 410 411 420 private Date getDate() { 421 if (currentDate == null) { 422 currentDate = new Date (); 423 } else { 424 long systime = System.currentTimeMillis(); 426 if ((systime - currentDate.getTime()) > 1000) { 427 currentDate = new Date (systime); 428 } 429 } 430 431 return currentDate; 432 } 433 434 439 440 public void destroy() { 441 } 442 443 446 private synchronized void close() { 447 448 if (writer == null) return; 449 writer.flush(); 450 writer.close(); 451 writer = null; 452 453 } 454 455 462 public void log(String message, File dir) { 463 464 if (rotatable) { 465 long systime = System.currentTimeMillis(); 467 if ((systime - rotationLastChecked) > 1000) { 468 469 currentDate = new Date (systime); 471 rotationLastChecked = systime; 472 473 String tsDate = dateFormatter.format(currentDate); 475 476 if (!dateStamp.equals(tsDate)) { 478 synchronized (this) { 479 if (!dateStamp.equals(tsDate)) { 480 close(); 481 dateStamp = tsDate; 482 open(dir); 483 } 484 } 485 } 486 } 487 } 488 489 if (writer != null) { 491 writer.println(message); 492 } 493 494 } 495 496 499 private synchronized void open(File dir) { 500 501 try { 503 String pathname; 504 if (rotatable) { 506 pathname = dir.getAbsolutePath() + File.separator + prefix + dateStamp + suffix; 507 } else { 508 pathname = dir.getAbsolutePath() + File.separator + prefix + suffix; 509 } 510 writer = new PrintWriter (new FileWriter (pathname, true), true); 511 } catch (IOException e) { 512 writer = null; 513 } 514 515 } 516 } | Popular Tags |