View | Details | Raw Unified | Return to bug 48501
Collapse All | Expand All

(-)jk_isapi_plugin.c (-4 / +175 lines)
Lines 134-139 Link Here
134
#define ENABLE_CHUNKED_ENCODING_TAG ("enable_chunked_encoding")
134
#define ENABLE_CHUNKED_ENCODING_TAG ("enable_chunked_encoding")
135
#define ERROR_PAGE_TAG              ("error_page")
135
#define ERROR_PAGE_TAG              ("error_page")
136
136
137
#define LOG_ROTATION_TIME_TAG       ("log_rotationtime")
138
#define LOG_FILESIZE_TAG            ("log_filesize")
139
137
/* HTTP standard headers */
140
/* HTTP standard headers */
138
#define TRANSFER_ENCODING_CHUNKED_HEADER_COMPLETE     ("Transfer-Encoding: chunked")
141
#define TRANSFER_ENCODING_CHUNKED_HEADER_COMPLETE     ("Transfer-Encoding: chunked")
139
#define TRANSFER_ENCODING_CHUNKED_HEADER_COMPLETE_LEN (26)
142
#define TRANSFER_ENCODING_CHUNKED_HEADER_COMPLETE_LEN (26)
Lines 485-490 Link Here
485
static jk_map_t *jk_environment_map = NULL;
488
static jk_map_t *jk_environment_map = NULL;
486
489
487
static jk_logger_t *logger = NULL;
490
static jk_logger_t *logger = NULL;
491
static JK_CRIT_SEC log_cs;
488
static char *SERVER_NAME = "SERVER_NAME";
492
static char *SERVER_NAME = "SERVER_NAME";
489
static char *SERVER_SOFTWARE = "SERVER_SOFTWARE";
493
static char *SERVER_SOFTWARE = "SERVER_SOFTWARE";
490
static char *INSTANCE_ID = "INSTANCE_ID";
494
static char *INSTANCE_ID = "INSTANCE_ID";
Lines 493-499 Link Here
493
static char extension_uri[INTERNET_MAX_URL_LENGTH] =
497
static char extension_uri[INTERNET_MAX_URL_LENGTH] =
494
    "/jakarta/isapi_redirect.dll";
498
    "/jakarta/isapi_redirect.dll";
495
static char log_file[MAX_PATH * 2];
499
static char log_file[MAX_PATH * 2];
500
static char log_file_effective[MAX_PATH * 2];
496
static int  log_level = JK_LOG_DEF_LEVEL;
501
static int  log_level = JK_LOG_DEF_LEVEL;
502
static long log_rotationtime = 0;
503
static time_t log_next_rotate_time = 0;
504
static long log_filesize = 0;
505
497
static char worker_file[MAX_PATH * 2];
506
static char worker_file[MAX_PATH * 2];
498
static char worker_mount_file[MAX_PATH * 2] = {0};
507
static char worker_mount_file[MAX_PATH * 2] = {0};
499
static int  worker_mount_reload = JK_URIMAP_DEF_RELOAD;
508
static int  worker_mount_reload = JK_URIMAP_DEF_RELOAD;
Lines 563-568 Link Here
563
572
564
static int init_jk(char *serverName);
573
static int init_jk(char *serverName);
565
574
575
576
static int JK_METHOD iis_log_to_file(jk_logger_t *l, int level,
577
                                    int used, char *what);
578
566
static BOOL initialize_extension(void);
579
static BOOL initialize_extension(void);
567
580
568
static int read_registry_init_data(void);
581
static int read_registry_init_data(void);
Lines 2279-2287 Link Here
2279
        }
2292
        }
2280
        wc_close(logger);
2293
        wc_close(logger);
2281
        jk_shm_close();
2294
        jk_shm_close();
2295
        JK_ENTER_CS(&(log_cs), rc);
2282
        if (logger) {
2296
        if (logger) {
2283
            jk_close_file_logger(&logger);
2297
            jk_close_file_logger(&logger);
2284
        }
2298
        }
2299
        JK_LEAVE_CS(&(log_cs), rc);
2285
    }
2300
    }
2286
    JK_LEAVE_CS(&(init_cs), rc);
2301
    JK_LEAVE_CS(&(init_cs), rc);
2287
2302
Lines 2341-2346 Link Here
2341
        StringCbPrintf(HTTP_WORKER_HEADER_INDEX, MAX_PATH, HTTP_HEADER_TEMPLATE, WORKER_HEADER_INDEX_BASE, hInst);
2356
        StringCbPrintf(HTTP_WORKER_HEADER_INDEX, MAX_PATH, HTTP_HEADER_TEMPLATE, WORKER_HEADER_INDEX_BASE, hInst);
2342
2357
2343
        JK_INIT_CS(&init_cs, rc);
2358
        JK_INIT_CS(&init_cs, rc);
2359
        JK_INIT_CS(&log_cs, rc);
2344
2360
2345
    break;
2361
    break;
2346
    case DLL_PROCESS_DETACH:
2362
    case DLL_PROCESS_DETACH:
Lines 2350-2355 Link Here
2350
        __except(1) {
2366
        __except(1) {
2351
        }
2367
        }
2352
        JK_DELETE_CS(&init_cs, rc);
2368
        JK_DELETE_CS(&init_cs, rc);
2369
        JK_DELETE_CS(&log_cs, rc);
2353
        break;
2370
        break;
2354
2371
2355
    default:
2372
    default:
Lines 2393-2406 Link Here
2393
    return 0;
2410
    return 0;
2394
}
2411
}
2395
2412
2413
/*
2414
 * Reinitializes the logger, formatting the log file name if rotation is enabled,
2415
 * and calculating the next rotation time if applicable.
2416
 */
2417
static int init_logger(int rotate, jk_logger_t **l)
2418
{
2419
    int rc = JK_TRUE;
2420
    int log_open = rotate;  /* log is assumed open if a rotate is requested */
2421
    char *log_file_name;
2422
    char log_file_name_buf[MAX_PATH*2];
2423
2424
    /* If log rotation is enabled, format the log filename */
2425
    if ((log_rotationtime > 0) || (log_filesize > 0)) {
2426
        time_t t;
2427
        t = time(NULL);
2428
2429
        if (log_rotationtime > 0) {
2430
            /* Align time to rotationtime intervals */
2431
            t = (t / log_rotationtime) * log_rotationtime;
2432
2433
            /* Calculate rotate time */
2434
            log_next_rotate_time = t + log_rotationtime;
2435
        }
2436
2437
        log_file_name = log_file_name_buf;
2438
        if (strchr(log_file, '%')) {
2439
            struct tm *tm_now;
2440
2441
            /* If there are %s in the log file name, treat it as a sprintf format */
2442
            tm_now = localtime(&t);
2443
            strftime(log_file_name, MAX_PATH*2, log_file, tm_now);
2444
        } else {
2445
            /* Otherwise append the number of seconds to the base name */        
2446
            sprintf_s(log_file_name, MAX_PATH*2, "%s.%d", log_file, (long)t);
2447
        }
2448
    } else {
2449
        log_file_name = log_file;
2450
    }
2451
2452
    /* Close the current log file if required, and the effective log file name has changed */
2453
    if (log_open && strncmp(log_file_name, log_file_effective, strlen(log_file_name)) != 0) {
2454
        FILE* lf = ((jk_file_logger_t* )logger->logger_private)->logfile;
2455
        fprintf_s(lf, "Log rotated to %s\r\n", log_file_name);
2456
        fflush(lf);
2457
2458
        rc = jk_close_file_logger(&logger);
2459
        log_open = JK_FALSE;
2460
    }
2461
2462
    if (!log_open) {
2463
        if (jk_open_file_logger(&logger, log_file_name, log_level)) {
2464
            logger->log = iis_log_to_file;
2465
2466
            /* Remember the current log file name for the next potential rotate */
2467
            strcpy_s(log_file_effective, MAX_PATH * 2, log_file_name);
2468
            rc = JK_TRUE;
2469
        } else {
2470
            logger = NULL;
2471
            rc = JK_FALSE;
2472
        }
2473
    }
2474
2475
    /* Update logger being used for this log call so it occurs on new file */
2476
    (*l) = logger;
2477
    return rc;
2478
}
2479
2480
/*
2481
 * Checks whether the log needs to be rotated. Must be called while holding the log lock.
2482
 * The behaviour here is based on the Apache rotatelogs program.
2483
 * http://httpd.apache.org/docs/2.0/programs/rotatelogs.html
2484
 */
2485
static int JK_METHOD rotate_log_file(jk_logger_t **l)
2486
{
2487
    int rc = JK_TRUE;
2488
    int rotate = JK_FALSE;
2489
2490
    if (log_rotationtime > 0) {
2491
        time_t t = time(NULL);
2492
        
2493
        if (t >= log_next_rotate_time) {
2494
            rotate = JK_TRUE;
2495
        }
2496
    } else if (log_filesize > 0) {
2497
#if _MSC_VER >= 1400
2498
        long filesize = _ftell_nolock(((jk_file_logger_t *)(*l)->logger_private)->logfile);
2499
#else
2500
        long filesize = ftell(((jk_file_logger_t *)(*l)->logger_private)->logfile);
2501
#endif
2502
        if (filesize >= log_filesize) {
2503
            rotate = JK_TRUE;
2504
        }
2505
    }
2506
    if (rotate) {
2507
        rc = init_logger(JK_TRUE, l);
2508
    }
2509
    return rc;
2510
}
2511
2512
/*
2513
 * Log messages to the log file, rotating the log when required.
2514
 */
2515
static int JK_METHOD iis_log_to_file(jk_logger_t *l, int level,
2516
                                    int used, char *what)
2517
{
2518
    int rc = JK_FALSE;
2519
2520
    if (l &&
2521
        (l->level <= level || level == JK_LOG_REQUEST_LEVEL) &&
2522
        l->logger_private && what && used > 0) {
2523
        jk_file_logger_t *p = l->logger_private;
2524
        rc = JK_TRUE;
2525
2526
        if (p->logfile) {
2527
            what[used++] = '\r';
2528
            what[used++] = '\n';
2529
            what[used] = '\0';
2530
    
2531
            /* Perform logging within critical section to protect rotation */
2532
            JK_ENTER_CS(&(log_cs), rc);
2533
            if (rc && rotate_log_file(&l)) {
2534
                /* The rotation process will reallocate the jk_logger_t structure, so refetch */ 
2535
                FILE *rotated = ((jk_file_logger_t *)l->logger_private)->logfile;
2536
                fputs(what, rotated);
2537
                fflush(rotated);
2538
                JK_LEAVE_CS(&(log_cs), rc);
2539
            }
2540
        }
2541
    }
2542
    return rc;
2543
}
2544
2396
static int init_jk(char *serverName)
2545
static int init_jk(char *serverName)
2397
{
2546
{
2398
    char shm_name[MAX_PATH];
2547
    char shm_name[MAX_PATH];
2399
    int rc = JK_FALSE;
2548
    int rc = JK_FALSE;
2400
2549
    
2401
    if (!jk_open_file_logger(&logger, log_file, log_level)) {
2550
    init_logger(JK_FALSE, &logger);
2402
        logger = NULL;
2403
    }
2404
    StringCbCopy(shm_name, MAX_PATH, SHM_DEF_NAME);
2551
    StringCbCopy(shm_name, MAX_PATH, SHM_DEF_NAME);
2405
2552
2406
    jk_log(logger, JK_LOG_INFO, "Starting %s", (VERSION_STRING));
2553
    jk_log(logger, JK_LOG_INFO, "Starting %s", (VERSION_STRING));
Lines 2431-2436 Link Here
2431
2578
2432
        jk_log(logger, JK_LOG_DEBUG, "Using log file %s.", log_file);
2579
        jk_log(logger, JK_LOG_DEBUG, "Using log file %s.", log_file);
2433
        jk_log(logger, JK_LOG_DEBUG, "Using log level %d.", log_level);
2580
        jk_log(logger, JK_LOG_DEBUG, "Using log level %d.", log_level);
2581
        jk_log(logger, JK_LOG_DEBUG, "Using log rotation time %d.", log_rotationtime);
2582
        jk_log(logger, JK_LOG_DEBUG, "Using log file size %d.", log_filesize);
2583
2434
        jk_log(logger, JK_LOG_DEBUG, "Using extension uri %s.", extension_uri);
2584
        jk_log(logger, JK_LOG_DEBUG, "Using extension uri %s.", extension_uri);
2435
        jk_log(logger, JK_LOG_DEBUG, "Using worker file %s.", worker_file);
2585
        jk_log(logger, JK_LOG_DEBUG, "Using worker file %s.", worker_file);
2436
        jk_log(logger, JK_LOG_DEBUG, "Using worker mount file %s.",
2586
        jk_log(logger, JK_LOG_DEBUG, "Using worker mount file %s.",
Lines 2459-2464 Link Here
2459
                                     DEFAULT_WORKER_THREADS);
2609
                                     DEFAULT_WORKER_THREADS);
2460
    }
2610
    }
2461
2611
2612
    if ((log_rotationtime > 0) && (log_filesize > 0)) {
2613
        jk_log(logger, JK_LOG_WARNING, 
2614
            "%s is defined in configuration, but will be ignored because %s is set. ",
2615
            LOG_FILESIZE_TAG, LOG_ROTATION_TIME_TAG);
2616
    }
2617
2462
    if (rewrite_rule_file[0] && jk_map_alloc(&rewrite_map)) {
2618
    if (rewrite_rule_file[0] && jk_map_alloc(&rewrite_map)) {
2463
        if (jk_map_read_properties(rewrite_map, NULL, rewrite_rule_file,
2619
        if (jk_map_read_properties(rewrite_map, NULL, rewrite_rule_file,
2464
                                   NULL, JK_MAP_HANDLE_RAW, logger)) {
2620
                                   NULL, JK_MAP_HANDLE_RAW, logger)) {
Lines 2640-2645 Link Here
2640
    if (get_config_parameter(src, JK_LOG_LEVEL_TAG, tmpbuf, sizeof(tmpbuf))) {
2796
    if (get_config_parameter(src, JK_LOG_LEVEL_TAG, tmpbuf, sizeof(tmpbuf))) {
2641
        log_level = jk_parse_log_level(tmpbuf);
2797
        log_level = jk_parse_log_level(tmpbuf);
2642
    }
2798
    }
2799
    if (get_config_parameter(src, LOG_ROTATION_TIME_TAG, tmpbuf, sizeof(tmpbuf))) {
2800
        log_rotationtime = atol(tmpbuf);
2801
        if (log_rotationtime < 0) {
2802
            log_rotationtime = 0;
2803
        }
2804
    }
2805
    if (get_config_parameter(src, LOG_FILESIZE_TAG, tmpbuf, sizeof(tmpbuf))) {
2806
        log_filesize = atol(tmpbuf);
2807
        if (log_filesize < 0) {
2808
            log_filesize = 0;
2809
        }
2810
        /* Convert to MB as per Apache rotatelogs */
2811
        log_filesize *= (1000 * 1000);
2812
    }
2813
2643
    ok = ok && get_config_parameter(src, EXTENSION_URI_TAG, extension_uri, sizeof(extension_uri));
2814
    ok = ok && get_config_parameter(src, EXTENSION_URI_TAG, extension_uri, sizeof(extension_uri));
2644
    ok = ok && get_config_parameter(src, JK_WORKER_FILE_TAG, worker_file, sizeof(worker_file));
2815
    ok = ok && get_config_parameter(src, JK_WORKER_FILE_TAG, worker_file, sizeof(worker_file));
2645
    ok = ok && get_config_parameter(src, JK_MOUNT_FILE_TAG, worker_mount_file, sizeof(worker_mount_file));
2816
    ok = ok && get_config_parameter(src, JK_MOUNT_FILE_TAG, worker_mount_file, sizeof(worker_mount_file));

Return to bug 48501